2010-11-25 58 views
1

有沒有一種方法可以逐行捕獲我的Java程序的stdout和stderror?Java:將stdout和stderr編程到某種處理程序

也許類似於您使用addHandler向記錄器實例添加處理程序的方式。

編輯:我不想更換默認處理程序 - 我仍然需要輸出顯示在命令行上。

+0

要求是什麼原因?如果是用於日誌記錄或調試,則應考慮使用日誌記錄框架而不是stderr和stdout。如果你使用的是* nix系統,你可以將stdout和stderr重定向到一個文件中並拖拽文件... – beggs 2010-11-25 03:19:55

+0

我正在編寫一個流API,您可以在其中獲得該程序的控制檯輸出。所以無論進入控制檯還可以將其視爲一個http流。 – 2010-11-25 03:33:01

回答

3

通過使用System.setOut()System.setErr()您可以將標準輸出和錯誤流設置爲任何PrintStream並捕獲所有內容。

此外: 我不知道是否存在任何優雅的方式來做到這一點,但這樣做的一個方法是:
1.保存默認的輸出流
的PrintStream defaultOut = System.out的;
(System.getOut()雖然會很有趣)
2.將System.out重定向到您想要的打印流(例如任何文件)
3.不要使用System.out.println()函數,它的確如下:
print(Object o){
defaultOut.println(o); //假設defaultOut在這個函數中是可見的
System.out.println(o); }

2

的方法System.setOutSystem.setErr允許您更改PrintStream對象的System.outSystem.err變量參考。您可以使用它們將捕獲輸出的對象替換爲默認的對象,或者使用它來執行任何您想要的操作。

隨訪

我不想更換PrintStreams,因爲我還需要輸出去命令行。

您的代碼可以照顧的是:

  1. 創建的OutputStream一個子類,它會將所有輸出到另一個OutputStream實例,還捕獲輸出。使「其他」實例成爲一個構造參數。
  2. 獲取當前值System.outSystem.err
  3. 實例化您的子類兩次,其中System.outSystem.err值分別作爲構造函數參數。
  4. 將這兩個實例包裝爲PrintStream實例。
  5. 請致電System.setOutSystem.setErrSystem.outSystem.err替換爲PrintStream實例。
+0

我遲了13秒:( – 2010-11-25 02:55:13