读取系统.Out

Soc*_*nix 1 java system.out system.err

所以,我想做的基本上是过滤通过的所有内容System.outSystem.err是否可以应用某种过滤器或创建我自己的过滤器OutputStream来转移System.out,然后正常处理它?

为了清楚起见进行编辑:为了澄清,我需要从其他程序中读取 System.out 的内容,并按照我认为合适的方式操作它,因此记录器并不是真正的选项,因为我无法控制其他程序将使用的内容。

为了更清楚地进行编辑:我正在为一个更大的程序创建一个插件,该程序需要读取从其他插件写入 System.out 的所有内容。因为它是一个基于插件的系统,所以我的插件运行的进程将始终与其他插件运行的进程相同。

Adr*_*hum 5

我不清楚的事情是:您提到您想要“从其他程序中读取 System.out 的内容”。您的应用程序是在创建进程并希望监视其标准输出/错误,还是希望监视进程本身的标准输出/错误?

对于前一种情况,创建流程后,您可以获得其输出输入错误流。

对于后一种情况,您可以将 Java 流程中的标准替换为System.setOut(yourOwnOutputStream);

但是,如果您尝试处理完全不相关的进程流,我相信如果没有调用者将 stdout/stderr 通过管道传输到您的进程,就没有办法做到这一点(除非通过某些平台特定的方法)


更新:

为了“拦截”标准输出,它与所有那些经典的“过滤输出流”没有什么不同。你可以做的是这样的:

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;

class AnalyzingOutputStream extends FilterOutputStream {

    public AnalyzingOutputStream (OutputStream out) {
        super(out);
    }

    @Override
    public void write(int b) throws IOException {
          // do whatever analysis you want
          super.write(b);  // delegate to super class' write, which will 
                           // delegate to the filtered outputstream
    }
    // other overrides
}
Run Code Online (Sandbox Code Playgroud)

为了使用它,您的主要逻辑应该执行以下操作:

AnalyzingOutputStream analyzingOutputStream = new AnalyzingOutputStream(System.out);
System.setOut(analyzingOutputStream );

// then you can call your methods of AnalyzingOutputStream to do whatever you want
Run Code Online (Sandbox Code Playgroud)