-->

Java的:如何镜像控制台输出到文件(Java: How to mirror console out

2019-09-21 02:51发布

我需要监控的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