java - 读取系统.Out

标签 java system.out system.err

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

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

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

最佳答案

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

对于前一种情况,创建进程后,可以得到它的 output , inputerror流。

对于后一种情况,您可以通过 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/

相关文章:

java - 将 System.err.println 的输出重定向到文件而不更改代码

java - 警告/错误含义 - GbaRequest - GbaRequest : Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE

java - 输入 block 的哪个副本在映射器中处理?

java - 将 Akka HTTP 部署到 Azure

Java 打印带有两个分隔符的数组

java - Eclipse 控制台中没有输出,但其余方法有效

java - 如何将元数据添加到 red5 中录制的 flv 文件中?

java - 从jsp获取 "A corrupt or unuseable certificate was received"异常

java - 扫描仪对象的输入行在正式打印命令之前打印