Wann kann DataInputStream.skipBytes (n) n Bytes nicht überspringen?

8

Die Sun-Dokumentation für DataInput.skipBytes gibt an, dass "versucht wird, n Byte Daten aus dem Eingabestream zu überspringen, wobei die übersprungenen Bytes verworfen werden. Es kann jedoch eine kleinere Anzahl von Bytes übersprungen werden, möglicherweise Null. Dies kann aus einer beliebigen Zahl resultieren Das Erreichen des Dateiendes, bevor n Bytes übersprungen wurden, ist nur eine Möglichkeit. "

  1. Warum erreicht skipBytes() nicht die richtige Anzahl an Bytes? (Das DataInputStream , das ich verwende, wird entweder ein FileInputStream oder ein PipedInputStream enthalten.)

  2. Wenn ich auf jeden Fall n Bytes überspringen und ein EOFException werfen möchte, wenn dies dazu führt, dass ich zum Ende der Datei gehe, sollte ich readFully() verwenden und das resultierende Byte-Array ignorieren? Oder gibt es einen besseren Weg?

Simon Nickerson 09.09.2008, 08:19
quelle

4 Antworten

5

1) Möglicherweise sind nicht so viele Daten zum Lesen verfügbar (das andere Ende der Pipe hat möglicherweise noch nicht so viele Daten gesendet), und die implementierende Klasse ist möglicherweise nicht blockierend (dh sie gibt nur das zurück, was sie haben kann) , anstatt auf genügend Daten zu warten, um die Anfrage zu erfüllen).

Ich weiß nicht, ob sich tatsächlich irgendwelche Implementierungen auf diese Weise verhalten, aber die Schnittstelle ist so gestaltet, dass sie dies zulässt.

Eine andere Option ist einfach, dass die Datei während des Lesevorgangs geschlossen wird.

2) Entweder readFully () (was immer auf genügend Eingaben wartet oder aber fehlschlägt) oder skipBytes () in einer Schleife aufrufen. Ich denke, das erste ist wahrscheinlich besser, es sei denn, das Array ist wirklich riesig.

    
DrPizza 09.09.2008, 08:33
quelle
1

Josh Bloch hat dies kürzlich veröffentlicht. Es ist konsistent, dass InputStream.read nicht garantiert, so viele Bytes wie möglich zu lesen. Als API-Methode ist es jedoch völlig sinnlos. InputStream sollte wahrscheinlich auch readFully haben.

    
Tom Hawtin - tackline 09.09.2008 11:08
quelle
1

Es stellt sich heraus, dass readFully () mehr Performance-Overhead hinzufügt, als ich bereit war.

Am Ende habe ich kompromittiert: Ich rufe skipBytes () einmal auf, und wenn das weniger als die richtige Anzahl von Bytes zurückgibt, rufe ich readFully () für die verbleibenden Bytes auf.

    
Simon Nickerson 09.09.2008 13:08
quelle
1

Ich bin heute auf dieses Problem gestoßen. Es wurde eine Netzwerkverbindung auf einer virtuellen Maschine abgelesen, also könnte es eine Reihe von Gründen dafür geben. Ich löste es, indem ich einfach den Eingabestrom zwang, Bytes zu überspringen, bis es die Anzahl der Bytes übersprungen hatte, die ich wollte:

%Vor%     
Will 20.10.2010 12:41
quelle

Tags und Links