web-dev-qa-db-ja.com

Javaでは、どのようにSystem.outをnullにリダイレクトし、再び標準出力に戻すことができますか?

次のコードを使用して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!!!

誰かアイデアはありますか?

34
dgrant

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();
}
47

以下のクラスNullPrintStreamを次のように使用できます。

PrintStream original = System.out;
System.setOut(new NullPrintStream());
System.out.println("Message not shown.");
System.setOut(original);

そしてクラス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
    }

  }

}
19
Vladimir

JDK 11以降には OutputStream.nullOutputStream() があります。それはあなたが探しているものを正確に実行します:

System.setOut(new PrintStream(OutputStream.nullOutputStream());
2
Qw3ry

古い質問ですが、Windowsではこの小さな行で問題が解決しますか?

System.setOut(new PrintStream(new File("NUL")));

はるかに少ないコードで、私にはかなり直接的に見えます。

2
E.S.