我需要监控的Java控制台输出,我都试过,因为它是流检索输出的几种不同的方式,但我掉进了几个陷阱(循环相同的输出,只有一个输出的一部分被捕获,失去输出)和有决定去它以不同的方式。
我开发了流行的游戏,我的世界的服务器的Java插件,我需要能够监控从其他插件控制台输出。
我认为,要做到这一点的好办法是通过重定向控制台输出到文件,然后设置,检查该文件,执行任何它需要做的,然后清除更多的输入文件中反复出现的异步任务。 我想我可以用一个简单的使用System.setOut(PrintStream的流)的做到这一点; 和许多导游我可以找到关于谷歌的一个。
但是有一个问题,那就是为什么我今天问在这里。 我需要控制台输出保持像普通的控制台上,所以“镜像”。 我不能编辑任何插件的输出别的地方,它需要从什么我的Java插件可以做,只。 当然,也许上的文件中的每个计划的检查,我可以重新打印全部恢复控制台,但是这将导致正在打印的时间,这将不会是理想的块。 我希望这是可能的。 谢谢!
编辑:我不认为我充分解释。 “插件”的课程是由我制定的计划运行。 我不能改变如何类运行,我不能改变其他插件如何打印到控制台。 我也不想直接控制台输出日志记录文件,这种想法只是为了保持它在一个临时的地方,而它被解析。 理想情况下,我需要控制台输出的每一行传递给一个函数( parseString(String line)
),其执行的操作依赖于行的内容。 另外,我不明白我怎么能正常读取数据流内容逐条线,因此,如果有人对如何,请让我知道什么想法。 :)
Answer 1:
更改它之前捕获的System.out,并使用TeeOutputStream :
OutputStream myCaptureStream = ...;
PrintStream original = System.out;
OutptStream outputtee = new TeeOutputStream(originalOut, myCaptureStream);
PrintStream printTee = new PrintStream(outputTee);
System.setOut(printTee);
转换的输出流(myCaptureStream)给输入流
- 使用Java标准库的PipedOutputStream :
new PipedOutputStream
; 仔细阅读 - 你需要你的读者在另一个线程运行。 - 输入流转换为一个阅读器 ,
- 而到BufferedReader中 。
BufferedReader中给你readLine
方法。
伪代码:
// Feed myCaptureStream to TeeOutputStream
OutputStream myCaptureStream = new PipedOutputStream();
// Prepare to capture data being written to that output stream
InputStream myCaptureAsInputStream = new PipedInputStream(myCaptureStream);
Reader myCaptureReader = new InputStreamReader(myCaptureAsInputStream);
BufferedReader myCaptureBuffered = new BufferedReader(myCaptureReader, 1024);
// This must run on separate reader thread; in spin loop:
myCaptureBuffer.readLine
Answer 2:
你可以改变System.out和System.err的是你自己的自定义PrintStreams引用。 该解决方案是跨平台的,不像使用特定于平台的助手可执行诸如tee
。
文档System.setOut(为PrintStream)
你可以写你自己的PrintStream的子类,看起来是这样的:
class MirroringPrintStream extends PrintStream
{
PrintStream first, second;
public MirroringPrintStream(PrintStream first, PrintStream second)
{
// fail now rather than later
if (first == null || second == null) throw new NullPointerException();
this.first = first;
this.second = second;
}
@override
// methods go here (I do believe there are rather a lot of them, but they will all look the same)
}
然后,您可以使用System.setOut(new MirroringPrintStream(System.out, myLogStream))
其中myLogStream
是你打开你的日志文件中的PrintStream。 我不知道该如何处理追加到别的东西定期截断一个文件,你可能要与一个位进行试验。
一切都失败了,去irc.esper.net并询问它#risucraft
Answer 3:
假设这是控制台输出的友好收购,为什么不登录到自己的流镜像该控制台?
文章来源: Java: How to mirror console output to file