Czy w Javie istnieje Null OutputStream?

112

Muszę określić OutputStreaminterfejs API, którego używam, ale w rzeczywistości nie potrzebuję danych wyjściowych. Czy Java ma OutputStreamodpowiednik > /dev/null?

Brandon Yarbrough
źródło

Odpowiedzi:

19

Od wersji Java 11 istnieje statyczne narzędzie, które robi dokładnie to, czego potrzebujesz, statyczna metoda fabryczna OutputStream.nullOutputStream():

Zwraca nowy OutputStream, który odrzuca wszystkie bajty. Zwrócony strumień jest początkowo otwarty. Strumień jest zamykany przez wywołanie metody close (). Kolejne wywołania funkcji close () nie mają żadnego efektu.

Leventov
źródło
Świetnie, dziękuję za zwrócenie uwagi! Ale „od Java 11”? Myślę, że Java 11 była niedostępna dopiero od tygodnia.
Brandon Yarbrough
116
/**Writes to nowhere*/
public class NullOutputStream extends OutputStream {
  @Override
  public void write(int b) throws IOException {
  }
}
McDowell
źródło
15
Można to również łatwo zaimplementować w dowolnym miejscu, używając czegoś takiego: OutputStream nullOutputStream = new OutputStream() { @Override public void write(int b) { } };
Hank Schultz
42

To nie jest jeszcze wspomnieć, więc będę również dodać guawy „s ByteStreams . nullOutputStream () , ponieważ niektórzy wolą Guava niż Apache Commons IO lub mają go już w swoim projekcie.

Uwaga: jeśli używasz starszej wersji Guava (od 1.0 do 13.0), chcesz użyć com.google.io.NullOutputStream .

haylem
źródło
15

Ponowne skasowanie już udzielonych odpowiedzi -

Java nie ma NullOutputStreamklasy. Można jednak toczyć własną rękę OutputStream, że ignoruje wszelkie zapisane na nim dane - innymi słowy write(int b), write(byte[] b)i write(byte[] b, int off, int len)będzie mieć pustych ciał metod. To właśnie NullOutputStreamrobi klasa Common IO .

Vineet Reynolds
źródło
3

Nie w standardowej bibliotece AFAIK, ale nie powinno być trudno ją utworzyć, zastępując zapis w OutputStream

Uri
źródło
Dlaczego to zostało odrzucone? Wdrożenie tego rozwiązania jest rzeczywiście trywialne, jak pokazał McDowell powyżej.
pdxleif
1

W mieście pojawił się nowy chłopak, który zajmuje się tym jak marzenie, wystarczy kilka linijek kodu. Jego JDK 11 i nullWriter () zostały tam wprowadzone, które to załatwiają. Oto kod, który rozwiązuje ten sam stary problem, nowy sposób bez martwienia się o system operacyjny (OS).

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

Mam nadzieję, że to może komuś pomóc!

Czerwony chłopiec
źródło
0

Uważam, że właśnie tego szukasz, szukałem tego samego: to jest do przekierowywania strumieni wyjściowych ze standardowego błędu, standardowo w obiektach ProcessBuilder.

Zablokować cytat

pb.redirectError( ProcessBuilder.Redirect.appendTo( new File( "NUL:" ) ) );
  • Dom
Dominik
źródło
Dotyczy to systemu Windows.
peterh
-4

ByteArrayOutputStreamjest tym, czego chcesz (zakładając, że API będzie wyświetlało tekst). Po prostu utwórz nową instancję.

gostone
źródło
2
To zły pomysł, ponieważ będziesz gromadzić dane w pamięci, zamiast je wyrzucać. Co się stanie, jeśli autor zapisuje 15 GB śmieci na twoim BAOS? To może się zdarzyć.
traktuj dobrze swoje mody