Java程序如何完全读取自己的控制台输出?

3

首先,我知道如果你想启动一个进程并获取它的控制台输出,你可以使用以下代码:

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process proc;
proc = builder.start();
InputStreamReader isr = new InputStreamReader(proc.getInputStream());
BufferedReader reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

但是如果我想要获取当前正在运行的Java程序的整个控制台输出怎么办?能否在不漏掉任何内容的情况下读取它?我确定用于在控制台中显示文本的程序在某些地方使用System.out.println(),在大多数情况下它使用许多java.util.logging.Logger实例,并且可能还有其他一些方法。
顺便问一下,Logger类最终是简单地使用System.out打印文本,还是使用其他特殊的记录方法?
无论如何,我是否可以以某种方式监听所有这些内容?
提前感谢。

可能你可以在内存中搜索负责向控制台输出的类的实例,并将文本重定向到你自己的流/读取器。 - kukis
1
我很关心你为什么想要这样做,或者你认为需要这样做的上下文是什么。大多数程序员会认为操纵输出流是一个不好的主意。坦白地说,下面关于从控制台重定向输出的答案是更好的方向,但我们可能需要更多的上下文。 - markspace
1
Logger类通常不使用System.out。根据配置,Logger类可能会使用ConsoleHandler,将输出发送到System.err。但是,该记录器仅委托处理程序,它本身不使用任何输出方法。 - markspace
1个回答

0

这可能不是您问题的完整解决方案,但这是我曾经使用过的一种解决方法。

您可以将程序标准输出重定向到文件中,并从程序本身读取该文件,因为它会随着更改而改变。

对于基于控制台的应用程序,您可以使用以下命令将控制台输出重定向到文件中:

java -cp temp.jar test.Main >> program.log

即使程序仍在运行,program.log文件将创建包含所有标准输出信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接