Java:在System.setOut之后写入真正的STDOUT

时间:2010-07-27 02:18:29

标签: java

我正在尝试拦截System.out和System.err,但保留了在必要时直接写入原始流的能力。

PrintStream ps = System.out;
System.setOut(new MyMagicPrintStream());
ps.println("foo");

不幸的是,System类实现的细节意味着在我的例子中,“foo”被发送到真正的stdout的MyMagicPrintStream instread。有谁知道如何获得真实/原始OutputStreams的引用。

谢谢!

PS:否则会导致StackOverflowError< - for SEO。

4 个答案:

答案 0 :(得分:29)

试试这个:

PrintStream ps = new PrintStream(new FileOutputStream(FileDescriptor.out))

答案 1 :(得分:14)

尝试这样的事情:

  PrintStream original = new PrintStream(System.out);

  // replace the System.out, here I redirect to NUL
  System.setOut(new PrintStream(new FileOutputStream("NUL:")));
  System.out.println("bar");  // no output

  // the original stream is still available 
  original.println("foo");  // output to stdout

答案 2 :(得分:1)

PrintStream original = System.out;
System.setOut(new MyMagicPrintStream());

// This will print to MyMagicPrintStream();
System.out.println("foo for MyMagicPrintStream");


System.setOut(original);

// This will print to original print stream;
System.out.println("foo for original print stream (stdout)");

这适合我。

答案 3 :(得分:1)

PrintStream original = new PrintStream(System.out);基本上包装了现有的引用 - 所以如果System.setOut()正在改变它 - 应该没有区别。这可能是特定JVM的一个问题,但我宁愿猜测MyMagicPrintStream或写入stdout的代码有问题。实际上,以下代码完全符合Sun 1.6.0_20-b02 for Windows的预期:

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

public class SystemOutTest {

public static void main(String args[]) {
    try {
        PrintStream ps = System.out;
        System.setOut(new PrintStream(new FileOutputStream("stdout.log")));

        System.out.println("foo");  
        ps.println("bar");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

“foo”转到stdout.log,“bar”转到控制台。

此外,如果您需要访问分配给JVM启动的原始stdin / out - 您可以使用System.console();(只需记住 - 它可以是null!)