В Java, как я могу перенаправить System.out на null, а затем обратно на 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!!!
У кого-нибудь есть идеи?
Ответы
Ответ 1
Человек, это не очень хорошо, потому что 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 not supported on other platforms");
System.setOut(original);
System.out.println("this should go to stdout");
}
catch (Exception e) {
e.printStackTrace();
}
Ответ 2
Вы можете использовать класс 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
}
}
}
Ответ 3
Старый вопрос, я знаю, но будет ли эта небольшая строка делать трюк в Windows?
System.setOut(new PrintStream(new File("NUL")));
Намного меньше кода и выглядит довольно прямо для меня.
Ответ 4
Начиная с JDK 11 существует OutputStream.nullOutputStream()
. Он делает именно то, что вы ищете:
System.setOut(new PrintStream(OutputStream.nullOutputStream());
Ответ 5
Я думаю, System.setOut(null); также должен работать. По крайней мере, это сработало для меня.