所以,我想做的基本上是过滤通过 System.out
和 System.err
传递的所有内容,是否可以应用某种过滤器或者创建我自己的OutputStream
来转移System.out
,然后正常处理它?</p>
为清楚起见进行编辑: 为了澄清这一点,我需要从其他程序中读取 System.out 中的内容,并按照我认为合适的方式对其进行操作,因此记录器并不是真正的选择,因为我无法控制其他程序将使用的内容。
编辑以获得更清晰的内容: 我正在为一个更大的程序创建一个插件,该程序需要读取从其他插件写入 System.out 的所有内容。因为它是一个基于插件的系统,所以我的插件运行的进程将始终与其他插件运行的进程相同。
最佳答案
有些事情我不清楚:您提到您想要“从其他程序中读取 System.out 的内容”。您的应用程序是在创建进程并希望监视其标准输出/错误,还是希望监视进程本身的标准输出/错误?
对于前一种情况,创建进程后,可以得到它的 output , input和 error流。
对于后一种情况,您可以通过 System.setOut(yourOwnOutputStream); 替换 Java 进程的标准输出
但是,如果您尝试处理完全不相关的进程流,我相信如果没有调用者将 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
}
为了使用它,您的主要逻辑应该执行以下操作:
AnalyzingOutputStream analyzingOutputStream = new AnalyzingOutputStream(System.out);
System.setOut(analyzingOutputStream );
// then you can call your methods of AnalyzingOutputStream to do whatever you want
关于java - 读取系统.Out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066313/