Hallo Freunde der If-Schleife!
Ich habe ein Verständnisproblem zu Streams. Ich lese in einer Schleife aus einem InputStream mittels der Methode read() jeweils immer nur ein Byte. Wenn dieses Byte den Wert -1 hat, breche ich den Schleifendurchlauf ab. Der Doku zufolge müsste das alles korrekt sein:
Da an dieser Stelle etwas nicht stimmte, baute ich mir einen Test und musste feststellen, dass am Ende des Streams, anstatt -1 stets 0 zurückgegeben wird.
=> jetzt frage ich mich natürlich, ob hier nur die Doku falsch ist (was echt ärgerlich wäre!) - oder ob mein Stream wirklich so viele Bytes mit dem Wert 0 hat, dass er den Java Heap zum überlaufen bringt.
Da ich auf einem Embedded System arbeite, welches für den Zugriff auf Dateine spezielle Bibliotheken benötigt und das Debugging auf dem Gerät recht umständlich ist, musste ich die Erzeugung des InputStreams in meinem Test-Paket nachbauen. Dafür habe ich folgende zwei Klassen ohne Änderung verwendet:
java.io: StringReader.java
Koders Code Search: ReaderInputStream.java - Java - AL20
Der StringReader erzeugt aus einem hart-kodierten String ein Reader-Objekt, welches dann an den Konstruktor der ReaderInputStream-Klasse übergeben wird.
Da dies aber recht offizielle Klassen sind (Oracle/Apache), sollten diese eigentlich nicht die Ursache des Problems sein... ???:L
In dem ReaderInputStream ist aber ebenfalls eine read()-Methode implementiert - und zwar wie folgt:
Diese Implementierung berücksichtigt für read() den Rückgaberwert 0, was wiederum ein Indiz dafür wäre, dass die oben genannte Doku falsch ist.
Ich weiß nicht so recht wem ich in dieser Situation trauen soll, daher wende ich mich vertrauensvoll an die Spezialisten auf diesem Gebiet: kann mir bitte jemand etwas Erleuchtung bescheren? :bahnhof:
Ich habe ein Verständnisproblem zu Streams. Ich lese in einer Schleife aus einem InputStream mittels der Methode read() jeweils immer nur ein Byte. Wenn dieses Byte den Wert -1 hat, breche ich den Schleifendurchlauf ab. Der Doku zufolge müsste das alles korrekt sein:
read
public abstract int read()
throws IOException
Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
A subclass must provide an implementation of this method.
Returns:
the next byte of data, or -1 if the end of the stream is reached.
Throws:
IOException - if an I/O error occurs.
Da an dieser Stelle etwas nicht stimmte, baute ich mir einen Test und musste feststellen, dass am Ende des Streams, anstatt -1 stets 0 zurückgegeben wird.
=> jetzt frage ich mich natürlich, ob hier nur die Doku falsch ist (was echt ärgerlich wäre!) - oder ob mein Stream wirklich so viele Bytes mit dem Wert 0 hat, dass er den Java Heap zum überlaufen bringt.
Da ich auf einem Embedded System arbeite, welches für den Zugriff auf Dateine spezielle Bibliotheken benötigt und das Debugging auf dem Gerät recht umständlich ist, musste ich die Erzeugung des InputStreams in meinem Test-Paket nachbauen. Dafür habe ich folgende zwei Klassen ohne Änderung verwendet:
java.io: StringReader.java
Koders Code Search: ReaderInputStream.java - Java - AL20
Der StringReader erzeugt aus einem hart-kodierten String ein Reader-Objekt, welches dann an den Konstruktor der ReaderInputStream-Klasse übergeben wird.
Da dies aber recht offizielle Klassen sind (Oracle/Apache), sollten diese eigentlich nicht die Ursache des Problems sein... ???:L
In dem ReaderInputStream ist aber ebenfalls eine read()-Methode implementiert - und zwar wie folgt:
Java:
public synchronized int read() throws IOException {
if (in == null) {
throw new IOException("Stream Closed");
}
byte result;
if (slack != null && begin < slack.length) {
result = slack[begin];
if (++begin == slack.length) {
slack = null;
}
} else {
byte[] buf = new byte[1];
if (read(buf, 0, 1) <= 0) { // hier wird auf <= geprüft, also -1 UND 0!
result = -1;
}
result = buf[0];
}
if (result < -1) {
result += 256;
}
return result;
}
Ich weiß nicht so recht wem ich in dieser Situation trauen soll, daher wende ich mich vertrauensvoll an die Spezialisten auf diesem Gebiet: kann mir bitte jemand etwas Erleuchtung bescheren? :bahnhof: