2010-02-23 10 views

Antwort

16

Die einzige Situation, in der ein InputStream0 von einem Aufruf read(byte[]) zurückkehren kann, ist, wenn die übergebene byte[] in eine Länge von 0 hat: von diesem Teil der JavaDoc

byte[] buf = new byte[0]; 
int read = in.read(buf); // read will contain 0 

Wie angegeben:

Wenn die Länge der b Null ist, werden keine Bytes gelesen und 0 zurückgegeben

Meine Schätzung: Sie haben available() verwendet, um zu sehen, wie groß der Puffer sein sollte, und er gab 0 zurück. Beachten Sie, dass dies ein Missbrauch von available() ist. Das JavaDoc gibt explizit Folgendes an:

Es ist nie richtig, den Rückgabewert dieser Methode zu verwenden, um einen Puffer zuzuweisen, der alle Daten in diesem Stream enthalten soll.

+2

Ich stimme zu: > Diese Methode blockiert, bis Eingabedaten verfügbar sind, das Ende der Datei erkannt wird oder eine Ausnahme ausgelöst wird. > Wenn die Länge von b Null ist, dann werden keine Bytes gelesen und 0 zurückgegeben; Andernfalls wird versucht, mindestens ein Byte zu lesen. > Wenn kein Byte verfügbar ist, weil der Stream am Ende der Datei steht, wird der Wert -1 zurückgegeben. ansonsten wird mindestens ein Byte gelesen und in b gespeichert. Danke! –

3

Nach Java API Doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[])

Es kann nur passieren, wenn die byte [] Sie bestanden hat null Punkte (neues Byte [0]).

In anderen Situationen muss es mindestens ein Byte zurückgeben. Oder -1, wenn EOF erreicht wurde. Oder eine Ausnahme.

Natürlich: es hängt von der tatsächlichen Implementierung des InputStream Sie verwenden !!! (es könnte ein falscher sein)

10

Werfen Sie einen Blick auf die Implementierung von javax.sound.AudioInputStream # lesen (byte [] b, int aus, int len) ... yuck. Sie haben die Standardjava.io.InputStream-Semantik vollständig verletzt und geben eine Lesegröße von 0 zurück, wenn Sie weniger als einen ganzen Datenrahmen anfordern.

Also leider; Der allgemeine Hinweis (und die api-Spezifikation) sollten verhindern, dass man sich mit der Rückgabe von Null befassen muss, wenn len> 0 ist. Aber selbst für von JDK bereitgestellte Klassen kann man nicht allgemein darauf vertrauen, dass dies für InputStreams beliebiger Typen gilt.

Noch einmal, yuck.

+0

InputStream von UrlConnection.getInputStream() scheint auch die Standardjava.io.InputStream-Semantik zu verletzen und gibt beim Lesen großer Dateien eine Lesegröße von 0 zurück. Kann das jemand bestätigen? – okwap

+0

^Ja, das ist bestätigt, ich kam zu dieser Frage bei der Suche nach dem gleichen genauen Problem von UrlConnection.getInputStream lesen eine Null 0 zurückgeben – taimur

0

beobachtete ich das gleiche Verhalten (Lesen 0 Byte), wenn ich ein Schaukel Konsole Ausgabefenster bauen und einen Leser-Thread für stdout und stderr über den folgenden Code aus:

 
       this.pi = new PipedInputStream(); 
       po = new PipedOutputStream((PipedInputStream)pi); 
       System.setOut(new PrintStream(po, true));
Wenn die ‚Haupt‘ Swing Anwendung beendet, und meine Konsolenfenster ist noch offen Ich lese 0 von this.pi.read(). Die gelesenen Daten wurden auf dem Konsolenfenster angezeigt, was zu einem Race-Zustand führte. Das Ignorieren des Ergebnisses und nicht das Aktualisieren des Konsolenfensters löste das Problem.

Verwandte Themen