所以,我想要做的基本上是过滤所有通过System.out和System.err传递的东西,是否有可能应用某种过滤器,或者创建自己的OutputStream来转移System.out,然后正常处理呢?
为了清晰起见,我需要阅读其他程序中的System.out内容,并对其进行操作,这样记录器就不是一个真正的选项,因为我无法控制其他程序将使用什么。
为了更清晰起见,我正在为一个更大的程序创建一个插件,它需要读取从其他插件写入System.out的所有内容。因为它是一个基于插件的系统,所以我的插件运行的进程总是和其他插件运行的进程相同。
发布于 2015-05-06 02:55:53
有些事情我还不清楚:您已经提到要“从其他程序( System.out )中阅读中的内容”。您的应用程序是在创建流程并希望监视其标准out/err,还是希望监视流程本身的标准out/err?
对于前一种情况,在创建流程之后,您可以获得它的输出、输入和错误流。
对于后一种情况,您可以用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发布于 2015-05-06 02:19:52
您应该使用记录器,但是如果您不想要,van创建您自己的PrintStream,其中包含System.out。然后调用System.setOut(yourPrintStream)。
发布于 2015-05-06 03:30:56
要在Java中捕获来自另一个进程的所有输出,最简单的方法是自己使用Runtime.exec启动流程,这将为您提供一个具有getOutputStream的Process对象。读取该流将为启动过程提供标准输出。
如果您试图捕获任意进程的输出,那么您前面还有一个更大的任务--这可能不是一个好主意。我不知道它在Windows上是如何工作的。在Linux下,您需要在您想要调查的进程(更可能是根进程)的同一个用户下运行。您可以查看/proc/<process id>/fd/<file descriptor>下任何给定进程的文件描述符。stdin、stdout和stderr的文件描述符分别为0、1和2。我建议你在这一点上停下来,重新考虑一下你想做什么。
https://stackoverflow.com/questions/30066313
复制相似问题