В Java, как я могу перенаправить System.out на ноль, а затем снова на стандартный вывод? - PullRequest
33 голосов
/ 26 января 2011

Я попытался временно перенаправить 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!!!

У кого-нибудь есть идеи?

Ответы [ 4 ]

46 голосов
/ 26 января 2011

Чувак, это не так хорошо, потому что 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();
}
19 голосов
/ 14 сентября 2013

Вы можете использовать класс 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
    }

  }

}
2 голосов
/ 10 октября 2013

Старый вопрос, я знаю, но будет ли эта маленькая строчка работать на Windows?

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

Гораздо меньше кода и выглядит довольно прямо для меня.

0 голосов
/ 03 февраля 2015

Я думаю, System.setOut (null); должно работать тоже. По крайней мере, у меня это сработало.

...