2017-01-02 41 views
1

首先,我知道,如果你想啓動一個進程,並從它那裏得到的控制檯輸出,可以使用例如下面的代碼:Java程序如何完全讀取自己的控制檯輸出?

ProcessBuilder builder = new ProcessBuilder(command); 
builder.redirectErrorStream(true); 
Process proc; 
proc = builder.start(); 
InputStreamReader isr = new InputStreamReader(proc.getInputStream()); 
BufferedReader reader = new BufferedReader(isr); 
String line; 
while ((line = reader.readLine()) != null) { 
    System.out.println(line); 
} 

但是如果我想獲得全控制檯輸出從目前運行的Java程序?是否有可能閱讀它而不丟失任何東西?我確定用於在控制檯中顯示文本的程序在某些地方使用System.out.println(),大多數情況下它使用java.util.logging.Logger的許多實例,也可能在其他某個地方使用其他方法。

順便說一句,Logger類到底是簡單地使用System.out來打印文本還是使用任何其他特殊的方法來記錄?

無論如何,我可以以某種方式聽取所有這些?

在此先感謝

+0

也許你可以在內存的實例中搜索輸出到控制檯並將文本重定向到你自己的流/讀者 – kukis

+1

我擔心你爲什麼要這麼做,或者你的上下文是什麼認爲這是必要的。大多數程序員會考慮搞亂輸出流是一個壞主意。坦率地說,下面關於重定向控制檯輸出的答案是一個更好的方向,但我們可能需要更多的上下文。 – markspace

+1

Logger類通常不使用System.out。根據配置,'Logger'類可以使用'ConsoleHandler',它將輸出發送到'System.err'。但是記錄器只委託處理程序,它本身不使用任何輸出方法。 – markspace

回答

0

這可能不是一個完整的解決方案,您的問題。但這是我在某處使用的一種解決方法。

您可以將您的程序標準輸出重定向到一個文件,並從您的程序本身讀取該文件,因爲它已更改。

對於基於控制檯的應用程序,您可以使用控制檯輸出重定向到文件 -

java -cp temp.jar test.Main >> program.log 

program.log文件將與連程序仍在運行的所有標準輸出的信息來創建。

相關問題