[英]Reading System.Out
因此,我要做的基本上是過濾通過System.out
和System.err
傳遞的所有內容,是否可以應用某種過濾器或創建我自己的OutputStream
來轉移System.out
,然后對其進行處理。一般?
為清晰起見,進行編輯:為了明確起見,我需要從其他程序中讀取System.out中的內容,並按照自己認為合適的方式進行操作,因此記錄器並不是真正的選擇,因為我無法控制其他程序將使用的內容。
編輯以便更清晰:我正在為一個較大的程序創建一個插件,該程序需要從其他插件讀取寫入System.out的所有內容。 因為它是一個基於插件的系統,所以我的插件運行的過程將始終與其他插件運行的過程相同。
我不清楚:您已經提到要“ 從其他程序中讀取System.out中的內容”。 您的應用程序是在創建流程並想要監視其標准輸出/錯誤,還是要監視流程本身的標准輸出/錯誤?
對於前一種情況,在創建流程之后,可以獲得其輸出 , 輸入和錯誤流。
對於后一種情況,可以用System.setOut(yourOwnOutputStream);
替換Java進程中的標准System.setOut(yourOwnOutputStream);
但是,如果您要處理完全不相關的流,我相信沒有調用者將stdout / stderr傳遞給您的進程是不可能的(除非通過某些平台特定的方法)
更新:
為了“攔截”標准,它與所有經典的“過濾器輸出流”沒有什么不同。 您可以執行以下操作:
class AnalyzingOutputStream extends FilterOutputStream {
public AnalyzingOutputStream (OutputStream out) {
super(out);
}
@Override
public void write(int b) {
// do whatever analysis you want
super.write(b); // delegate to super class' write, which will
// delegate to the filtered outputstream
}
// other overrides
}
為了使用它,您的主要邏輯應做以下事情:
AnalyzingOutputStream analyzingOutputStream = new AnalyzingOutputStream(System.out);
System.setOut(analyzingOutputStream );
// then you can call your methods of AnalyzingOutputStream to do whatever you want
您應該使用記錄器,但是如果不想,可以創建自己的PrintStream來保存System.out。 然后調用System.setOut(yourPrintStream)。
要捕獲Java中另一個進程的所有輸出,最簡單的方法是使用Runtime.exec
自己啟動該進程,這將為您提供一個具有getOutputStream
的Process
對象。 閱讀該流將為您提供啟動過程的標准輸出。
如果您試圖捕獲任意過程的輸出,那么您前面還有一個更大的任務-這可能不是一個好主意。 我不知道它如何在Windows上工作。 在Linux下,您需要以與要調查的進程相同的用戶身份運行(或更有可能是root用戶)。 您可以在/proc/<process id>/fd/<file descriptor>
下查看任何給定進程的/proc/<process id>/fd/<file descriptor>
。 stdin,stdout和stderr的文件描述符分別為0、1和2。 我建議您在這一點上停下來,然后重新考慮您要做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.