2011-04-17 169 views
1

如何將java輸出打印到shell控制檯並同時在某個文件中打印?那可能嗎?將java輸出打印到文件

+2

大多數日誌工具支持這種事情。例如,使用Log4J添加ConsoleAppender和FileAppender將執行此操作。有人提到SLF4J--這是真的,儘管它只是一個門面。據我所知,你仍然需要配置它將在幕後使用的日誌工具。 – Nick 2011-04-17 18:12:10

回答

6

你可以在你的程序開始包括以下行:

final PrintStream origout = System.out; 
final PrintStream fileout = new PrintStream(file); 
System.setOut(new PrintStream(new OutputStream() { 
    @Override 
    public void write(int b) throws IOException { 
     origout.write(b); 
     fileout.write(b); 
    } 
})); 
+0

我把這個放在我的主要方法的開始,但我得到各種錯誤,包括未定義的構造函數等,我導入了所有適當的包。請幫助 – CodyBugstein 2013-02-03 20:22:28

+0

我通過使用fileout替換新的OutputStream來實現它。但是,這導致我無法在控制檯中看到任何輸出,而只能在.txt文件中看到輸出。我怎樣才能輸出到兩個? – CodyBugstein 2013-02-03 20:31:31

0

您可以寫入控制檯。並寫入一個文件。你可以把它們分開,所以它們不依賴於彼此。

沒有一個API可以在我知道的同時執行這兩個API(不是說太多,寫一個應該是微不足道的)。

編輯:我誤解了嗎?你的意思是來自Java代碼還是隻是將java二進制文件的輸出傳送給控制檯和文件?在這種情況下,你可以這樣做:

java Main 2>&1 | tee -a Load.log 
0

您可以用SLF4J實現做到這一點,像Logback。這是JBoss(默認情況下)將輸出發送到控制檯以及日誌文件的方式。

+0

@downvoter:有什麼意見?您的反饋只能幫助我改進我的答案,或者說服我將其刪除,如果我只是明顯錯誤。 – 2011-04-17 21:07:47

+0

這需要更多的解釋。這不僅僅是一個回答而是一個評論 – CodyBugstein 2013-02-03 20:17:23

2

您可以使用System.setOut()System.Out重定向到自定義OutputStream,該自定義將其輸出複製到控制檯和文件。

+0

你能否詳細說明一下? – CodyBugstein 2013-02-03 20:15:47

0

最簡單的方法(因爲它不涉及真正的編程)是在Linux中使用三通命令,Mac OS X或Windows PowerShell中,像這樣:

java MyProg | tee outputfile.txt 

這適用於任何編程語言,不只是Java。