在Java中,如何将System.out重定向到null然后再返回到stdout?

dgr*_*ant 34 java iostream stdout

我试图使用以下代码临时将System.out重定向到/ dev/null但它不起作用.

System.out.println("this should go to stdout");

PrintStream original = System.out;
System.setOut(new PrintStream(new FileOutputStream("/dev/null")));
System.out.println("this should go to /dev/null");

System.setOut(original);
System.out.println("this should go to stdout"); // This is not getting printed!!!
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

Eli*_*ine 45

伙计,这不太好,因为Java是跨平台的,而'/ dev/null'是Unix特有的(显然在Windows上有另一种选择,请阅读评论).所以你最好的选择是创建一个自定义OutputStream来禁用输出.

try {
    System.out.println("this should go to stdout");

    PrintStream original = System.out;
    System.setOut(new PrintStream(new OutputStream() {
                public void write(int b) {
                    //DO NOTHING
                }
            }));
    System.out.println("this should go to /dev/null, but it doesn't because it's not supported on other platforms");

    System.setOut(original);
    System.out.println("this should go to stdout");
}
catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • NUL设备在窗口上有替代品; IIRC它是"NUL:"作为"文件名". (4认同)
  • 我将指出,在大多数情况下,您应该在finally块中恢复原始OutputStream. (4认同)
  • 但是+1,因为这是与平台无关的正确答案.但是,我还会覆盖write(byte [],int,int)以提高效率. (3认同)
  • Apache Commons IO中有新的NullOutputStream. (2认同)

小智 19

您可以使用下面的NullPrintStream类:

PrintStream original = System.out;
System.setOut(new NullPrintStream());
System.out.println("Message not shown.");
System.setOut(original);
Run Code Online (Sandbox Code Playgroud)

NullPrintStream类是......

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class NullPrintStream extends PrintStream {

  public NullPrintStream() {
    super(new NullByteArrayOutputStream());
  }

  private static class NullByteArrayOutputStream extends ByteArrayOutputStream {

    @Override
    public void write(int b) {
      // do nothing
    }

    @Override
    public void write(byte[] b, int off, int len) {
      // do nothing
    }

    @Override
    public void writeTo(OutputStream out) throws IOException {
      // do nothing
    }

  }

}
Run Code Online (Sandbox Code Playgroud)


Qw3*_*3ry 5

从 JDK 11 开始,有OutputStream.nullOutputStream(). 它完全符合您的要求:

System.setOut(new PrintStream(OutputStream.nullOutputStream());
Run Code Online (Sandbox Code Playgroud)