7 Stimmen

Prüfung auf leeren InputStream in Java

Wie Sie Jungs testen für eine leere InputStream? Ich weiß, dass InputStream ist entworfen, um mit Remote-Ressourcen zu arbeiten, so dass Sie nicht wissen können, ob es gibt, bis Sie tatsächlich von ihm lesen. Ich kann read() nicht verwenden, da sich die aktuelle Position ändern würde und die Verwendung von mark() und das Zurücksetzen dafür unangebracht zu sein scheint.

Das Problem ist, dass man manchmal nicht testen kann, ob read() -1 zurückgibt, denn wenn man einen Stream hat und eine Bibliothek eines Drittanbieters ihn benutzt, muss man testen, ob er leer ist, bevor man ihn dorthin sendet.

Mit leeren InputStreams meine ich diese new ByteArrayInputStream(new byte[0])

13voto

Leonel Punkte 27363

Sie können Ihren InputStream in eine PushbackInputStream . Diese Klasse speichert die ersten paar Bytes von read() in einem internen Puffer. Sie können später unread() die Bytes und übergeben das Objekt an die Bibliothek des Drittanbieters.

Ich mag ByteArrayInputStream nicht wirklich, denn es hält alle die Daten aus dem Stream im Speicher.

Außerdem sind Sie in jedem Fall gezwungen, read() zu verwenden, um zu prüfen, ob der Stream leer ist, was bedeutet, dass Sie das Netzwerk belasten, zumindest für ein paar Bytes.

6voto

thkala Punkte 80165

Es gibt einige Alternativen:

  • ByteArrayInputStreams und mehrere andere ähnliche Klassen sind per Definition nicht blockierend, da sich die Daten bereits im VM-Speicher befinden. In diesen Fällen ist die available() von InputStream könnte das sein, was Sie brauchen. Das wird pas funktionieren, wenn sie von einer Eingabequelle außerhalb des Programms gelesen werden, z. B. einem Netzwerksocket, der Standardeingabe oder vielleicht sogar einer Datei.

  • Wenn die markSupported() Methode gibt true für eine bestimmte InputStream können Sie unter Umständen die Funktion mark() y reset() Methoden, um zum Anfang des Streams zurückzukehren, nachdem sie versucht haben, die read() darauf.

EDIT:

Im Übrigen, ByteArrayInputStreams Unterstützung mark() y reset() recht gut und sie sind standardmäßig an der Position 0 . Dieser Code:

InputStream x = new ByteArrayInputStream(new String("1234567890").getBytes());

byte b[] = new byte[1];

x.read(b, 0 , 1);
System.out.println(b[0]);

x.read(b, 0 , 1);
System.out.println(b[0]);

x.reset();

x.read(b, 0 , 1);
System.out.println(b[0]);

hat diese Ausgabe:

49
50
49

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X