簡體   English   中英

讀取系統

[英]Reading System.Out

因此,我要做的基本上是過濾通過System.outSystem.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自己啟動該進程,這將為您提供一個具有getOutputStreamProcess對象。 閱讀該流將為您提供啟動過程的標准輸出。

如果您試圖捕獲任意過程的輸出,那么您前面還有一個更大的任務-這可能不是一個好主意。 我不知道它如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM