Soc*_*nix 1 java system.out system.err
所以,我想做的基本上是过滤通过的所有内容System.out,System.err是否可以应用某种过滤器或创建我自己的过滤器OutputStream来转移System.out,然后正常处理它?
为了清楚起见进行编辑:为了澄清,我需要从其他程序中读取 System.out 的内容,并按照我认为合适的方式操作它,因此记录器并不是真正的选项,因为我无法控制其他程序将使用的内容。
为了更清楚地进行编辑:我正在为一个更大的程序创建一个插件,该程序需要读取从其他插件写入 System.out 的所有内容。因为它是一个基于插件的系统,所以我的插件运行的进程将始终与其他插件运行的进程相同。
我不清楚的事情是:您提到您想要“从其他程序中读取 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)
| 归档时间: |
|
| 查看次数: |
2777 次 |
| 最近记录: |