Existe-t-il un OutputStream Null en Java?

112

Je dois spécifier un OutputStreampour une API que j'utilise, mais je n'ai pas vraiment besoin de la sortie. Java a-t-il un OutputStreaméquivalent à > /dev/null?

Brandon Yarbrough
la source

Réponses:

19

Depuis Java 11, il existe un utilitaire statique qui fait exactement ce dont vous avez besoin, une méthode de fabrique statique OutputStream.nullOutputStream():

Renvoie un nouveau OutputStream qui supprime tous les octets. Le flux renvoyé est initialement ouvert. Le flux est fermé en appelant la méthode close (). Les appels ultérieurs à close () n'ont aucun effet.

Leventov
la source
Génial, merci de l'avoir signalé! Mais "depuis Java 11"? Je pense que Java 11 n'est sorti que depuis une semaine.
Brandon Yarbrough
116
/**Writes to nowhere*/
public class NullOutputStream extends OutputStream {
  @Override
  public void write(int b) throws IOException {
  }
}
McDowell
la source
15
Cela peut également être facilement implémenté partout où vous en avez besoin en utilisant quelque chose comme ceci: OutputStream nullOutputStream = new OutputStream() { @Override public void write(int b) { } };
Hank Schultz
42

Il n'est pas mentionné, donc je vais aussi ajouter Goyave de ByteStreams . nullOutputStream () , car certains pourraient préférer Guava à Apache Commons IO ou l'avoir déjà dans leur projet.

Remarque: si vous utilisez une ancienne version de Guava (de 1.0 à 13.0), vous souhaitez utiliser com.google.io.NullOutputStream .

foin
la source
15

Revoir les réponses déjà fournies -

Java n'a pas de NullOutputStreamclasse. Vous pouvez cependant lancer le vôtre OutputStreamqui ignore toutes les données qui y sont écrites - en d'autres termes write(int b), write(byte[] b)et write(byte[] b, int off, int len)qui aura des corps de méthode vides. C'est ce que fait la NullOutputStreamclasse Common IO .

Vineet Reynolds
la source
3

Pas dans la bibliothèque standard AFAIK, mais il ne devrait pas être difficile d'en créer une en remplaçant l'écriture dans OutputStream

Uri
la source
Pourquoi cela a-t-il été rejeté? Il est en effet trivial de mettre en œuvre cette solution, comme l'a montré McDowell plus haut.
pdxleif
1

Il y a un nouveau garçon dans la ville, qui s'occupe de ça comme un charme, juste quelques lignes de code devraient fonctionner. Son JDK 11 et nullWriter () y ont été introduits, qui s'en charge. Voici le code pour traiter le même vieux problème, une nouvelle façon sans se soucier du système d'exploitation (OS).

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

J'espère que cela peut aider quelqu'un!

Garçon rouge
la source
0

Je pense que c'est ce que vous recherchez, je recherchais la même chose: il s'agit de rediriger les flux de sortie à partir d'une erreur standard, standard dans les objets ProcessBuilder.

Blockquote

pb.redirectError( ProcessBuilder.Redirect.appendTo( new File( "NUL:" ) ) );
  • Dom
Dominik
la source
Ceci est spécifique à Windows.
peterh
-4

ByteArrayOutputStreamest ce que vous voulez (en supposant que l'API produira du texte). Juste instancier un nouveau.

gostone
la source
2
C'est une mauvaise idée car vous accumulerez des données en mémoire au lieu de les jeter. Que faire si l'écrivain écrit 15 Go de courrier indésirable sur votre BAOS? Ça pourrait arriver.
traitez bien vos mods