[英]Reading System.Out
因此,我要做的基本上是过滤通过System.out
和System.err
传递的所有内容,是否可以应用某种过滤器或创建我自己的OutputStream
来转移System.out
,然后对其进行处理。一般?
为清晰起见,进行编辑:为了明确起见,我需要从其他程序中读取System.out中的内容,并按照自己认为合适的方式进行操作,因此记录器并不是真正的选择,因为我无法控制其他程序将使用的内容。
编辑以便更清晰:我正在为一个较大的程序创建一个插件,该程序需要从其他插件读取写入System.out的所有内容。 因为它是一个基于插件的系统,所以我的插件运行的过程将始终与其他插件运行的过程相同。
我不清楚:您已经提到要“ 从其他程序中读取System.out中的内容”。 您的应用程序是在创建流程并想要监视其标准输出/错误,还是要监视流程本身的标准输出/错误?
对于前一种情况,在创建流程之后,可以获得其输出 , 输入和错误流。
对于后一种情况,可以用System.setOut(yourOwnOutputStream);
替换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
您应该使用记录器,但是如果不想,可以创建自己的PrintStream来保存System.out。 然后调用System.setOut(yourPrintStream)。
要捕获Java中另一个进程的所有输出,最简单的方法是使用Runtime.exec
自己启动该进程,这将为您提供一个具有getOutputStream
的Process
对象。 阅读该流将为您提供启动过程的标准输出。
如果您试图捕获任意过程的输出,那么您前面还有一个更大的任务-这可能不是一个好主意。 我不知道它如何在Windows上工作。 在Linux下,您需要以与要调查的进程相同的用户身份运行(或更有可能是root用户)。 您可以在/proc/<process id>/fd/<file descriptor>
下查看任何给定进程的/proc/<process id>/fd/<file descriptor>
。 stdin,stdout和stderr的文件描述符分别为0、1和2。 我建议您在这一点上停下来,然后重新考虑您要做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.