重置标准输出流

52

我知道在Java中有一种方法System.setOut可以将标准输出流设置为任何用户定义的值。

但是,是否有一种方法可以重置标准输出流为之前存储的标准输出流或者默认的标准输出流?

2个回答

93

你可以通过FileDescriptor.out获取标准输出的文件描述符。要将标准输出重置为打印到控制台,需要执行以下操作:

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));

另一种方法是简单地保留原始对象,如下所示:

PrintStream stdout = System.out;
System.setOut(new PrintStream(logFile));

// ...

System.setOut(stdout);                   // reset to standard output

26

这是一个老问题,但它经常出现在谷歌搜索结果中,我想纠正一下。实际上,您可以通过使用FileDescriptor类来获得它。调用new PrintStream(new FileOutputStream(FileDescriptor.out)))应该会给您一个可以打印到标准输出的东西。

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;


public static void main(String [] args) {
    System.err.println("error.");
    System.out.println("out.");
    System.setOut(System.err);
    System.out.println("error?");
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
    System.out.println("out?");
}

2
你能否澄清一下是否接受的答案是不正确的(即System.setOut(stdout);是否按预期工作)?与仅存储原始流相比,您的方法有何优点?此外,我注意到System.out等都标记为“final”,请问您能否提供有关Java如何在内部处理setOut()的任何见解。 - dimo414
1
System.outSystem.err由底层本地C代码处理。它们被标记为“final”,以便在没有VM本地部分“注意到”的情况下不更改它们的指针值。提供的setOut()方法是必需的,以便让本地部分调整其内部引用。 - ksmonkey123

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