Existe um OutputStream nulo em Java?

112

Preciso especificar um OutputStreampara uma API que estou usando, mas na verdade não preciso da saída. Java tem um OutputStreamequivalente a > /dev/null?

Brandon Yarbrough
fonte

Respostas:

19

Desde o Java 11, existe um utilitário estático que faz exatamente o que você precisa, um método de fábrica estático OutputStream.nullOutputStream():

Retorna um novo OutputStream que descarta todos os bytes. O fluxo retornado é inicialmente aberto. O fluxo é fechado chamando o método close (). As chamadas subsequentes para close () não têm efeito.

Leventov
fonte
Incrível, obrigado por apontar isso! Mas "desde o Java 11"? Acho que o Java 11 foi lançado há apenas uma semana.
Brandon Yarbrough,
116
/**Writes to nowhere*/
public class NullOutputStream extends OutputStream {
  @Override
  public void write(int b) throws IOException {
  }
}
McDowell
fonte
15
Isso também pode ser facilmente implementado onde você precisar, usando algo assim: OutputStream nullOutputStream = new OutputStream() { @Override public void write(int b) { } };
Hank Schultz
15

Refazendo as respostas já fornecidas -

Java não tem NullOutputStreamclasse. No entanto, você pode rolar o seu próprio OutputStreamque ignora quaisquer dados gravados nele - em outras palavras write(int b), write(byte[] b)e write(byte[] b, int off, int len)terá corpos de método vazios. Isso é o que a NullOutputStreamclasse IO comum faz.

Vineet Reynolds
fonte
3

Não na biblioteca padrão AFAIK, mas não deve ser difícil criar uma substituindo a gravação em OutputStream

Uri
fonte
Por que isso foi rejeitado? Na verdade, é trivial implementar essa solução, como McDowell mostrou acima.
pdxleif
1

Há um novo garoto na cidade que cuida disso como um encanto, apenas algumas linhas de código devem funcionar. Seu JDK 11 e nullWriter () foram introduzidos lá, que cuidam disso. Aqui vai o código para lidar com o mesmo velho problema, de uma maneira nova, sem se preocupar com o Sistema Operacional (SO).

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

Espero que isso possa ajudar alguém!

Menino vermelho
fonte
0

Eu acredito que é isso que você está procurando, eu estava procurando a mesma coisa: isso é para redirecionar fluxos de saída de erro padrão, padrão em objetos ProcessBuilder.

Bloco de citação

pb.redirectError( ProcessBuilder.Redirect.appendTo( new File( "NUL:" ) ) );
  • Dom
Dominik
fonte
Isso é específico do Windows.
peterh
-4

ByteArrayOutputStreamé o que você deseja (assumindo que a API produzirá texto). Basta instanciar um novo.

gostone
fonte
2
Esta é uma má ideia porque você acumulará dados na memória em vez de jogá-los fora. E se o gravador gravar 15 GB de lixo em seu BAOS? Poderia acontecer.
trate bem seus mods