Есть ли в Java Null OutputStream?

114

Мне нужно указать OutputStreamAPI, который я использую, но на самом деле мне не нужны выходные данные. Есть ли у Java OutputStreamэквивалент > /dev/null?

Брэндон Ярбро
источник

Ответы:

21

Начиная с Java 11, существует статическая утилита, которая делает именно то, что вам нужно, статический фабричный метод OutputStream.nullOutputStream():

Возвращает новый OutputStream, который отбрасывает все байты. Возвращенный поток изначально открыт. Поток закрывается путем вызова метода close (). Последующие вызовы close () не имеют никакого эффекта.

Левентов
источник
Отлично, спасибо, что указали на это! Но «начиная с Java 11»? Я думаю, что Java 11 вышла всего неделю.
Брэндон Ярбро
116
/**Writes to nowhere*/
public class NullOutputStream extends OutputStream {
  @Override
  public void write(int b) throws IOException {
  }
}
Макдауэлл
источник
15
Это также можно легко реализовать там, где вам это нужно, используя что-то вроде этого: OutputStream nullOutputStream = new OutputStream() { @Override public void write(int b) { } };
Хэнк Шульц
42

Это еще не упоминается, так что я буду также добавить гуавы «s ByteStreams . nullOutputStream () , поскольку некоторые могут предпочесть Guava над Apache Commons IO или уже имеют его в своем проекте.

Примечание. Если вы используете старую версию Guava (от 1.0 до 13.0), вы хотите использовать com.google.io.NullOutputStream .

haylem
источник
15

Перефразируя уже предоставленные ответы -

В Java нет NullOutputStreamкласса. Однако вы можете свернуть свой собственный, OutputStreamкоторый игнорирует любые записанные в него данные - другими словами write(int b), write(byte[] b)и write(byte[] b, int off, int len)будет иметь пустые тела методов. Это то, что NullOutputStreamделает класс Common IO .

Винит Рейнольдс
источник
3

Не в стандартной библиотеке AFAIK, но создать ее, переопределив запись в OutputStream, не составит труда.

Ури
источник
Почему это было отклонено? Как показал Макдауэлл выше, реализовать это решение действительно тривиально.
pdxleif
3

Нет, но это довольно просто реализовать.

См. Этот вопрос «Как удалить System.out.println из кодовой базы»

И тогда вам просто нужно:

System.setOut( DevNull.out );

Или что-то вроде того :)

System.setOut (PrintStream)

OscarRyz
источник
Я получаю сообщение об ошибке: «не удается присвоить значение выходной переменной final»
Дэвид Грейсон,
1

В городе появился новый мальчик, который заботится об этом как обаяние, всего несколько строк кода должны работать. Здесь представлены его JDK 11 и nullWriter () , которые позаботятся об этом. Вот код для решения той же старой проблемы новым способом, не беспокоясь об операционной системе (ОС).

String fileContent = "Welcome to StackOverflow readers !! Here goes the question link...";
Writer writer = Writer.nullWriter();
writer.write(fileContent);
writer.close();

Надеюсь, это может кому-то помочь!

Красный мальчик
источник
0

Я считаю, что это то, что вы ищете, я искал то же самое: это для перенаправления выходных потоков из стандартной ошибки, стандартной для объектов ProcessBuilder.

Цитата

pb.redirectError( ProcessBuilder.Redirect.appendTo( new File( "NUL:" ) ) );
  • Дом
Dominik
источник
Это специфично для Windows.
Питер 07
-4

ByteArrayOutputStreamэто то, что вы хотите (при условии, что API будет выводить текст). Просто создайте новый экземпляр.

Gostone
источник
2
Это плохая идея, потому что вы будете накапливать данные в памяти, а не выбрасывать их. Что, если писатель записывает на ваш BAOS 15 ГБ мусора? Это могло случиться.
хорошо относитесь к своим модам