Есть ли в 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 .


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)


Я получаю сообщение об ошибке: «не удается присвоить значение выходной переменной 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:" ) ) );
  • Дом

Это специфично для Windows.
Питер 07

-4

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


2
Это плохая идея, потому что вы будете накапливать данные в памяти, а не выбрасывать их. Что, если писатель записывает на ваш BAOS 15 ГБ мусора? Это могло случиться.
хорошо относитесь к своим модам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.