有没有办法逐行捕获我的Java程序的stdout和stderror?
可能类似于您可以使用将处理程序添加到 Logger 实例的方式addHandler
。
编辑:我不想替换默认处理程序——我仍然需要输出显示在命令行上。
通过使用System.setOut()和System.setErr(),您可以将标准输出和错误流设置为任何 PrintStream,并捕获所有内容。
补充:
我不知道是否有任何优雅的方法可以做到这一点,但一种方法是:
1. 保存默认输出流
PrintStream defaultOut = System.out;
(虽然 System.getOut() 会很有趣)
2. 将 System.out 重定向到您想要的打印流(例如任何文件)
3. 使用您的打印函数而不是使用 System.out.println() ,它执行以下操作:
print(Object o){
defaultOut.println(o);//假设defaultOut在这个函数中是可见的
System.out.println(o); }
方法System.setOut
和System.setErr
允许您更改和变量引用的PrintStream
对象。您可以使用它们将默认对象替换为捕获输出的对象,或者用它做任何您想做的事情。System.out
System.err
PrintStream
跟进
我不想替换 PrintStreams,因为我仍然需要将输出转到命令行。
您的代码可以解决这个问题:
OutputStream
将所有输出写入另一个OutputStream
实例的子类,并捕获输出。使“其他”实例成为构造函数参数。 System.out
获取和的当前值System.err
。System.out
和System.err
值作为构造函数参数。PrintStream
实例。System.setOut
and用实例System.setErr
替换System.out
and 。System.err
PrintStream
消息控制台允许您在文本窗格中显示输出并将其显示在命令行上。