我不清楚的事情:你提到你想“从其他程序中读取 System.out 的内容”。您的应用程序是在创建流程并想要监控其标准输出/错误,还是您想要监控流程本身的标准输出/错误?
对于前一种情况,创建流程后,您可以获得其输出、输入和错误流。
对于后一种情况,您可以通过以下方式替换 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