Ich verarbeite einen binären Datenstrom und muss effizient über eine Reihe von Daten, die mich nicht interessieren, auf einige Daten überspringen, die verarbeitet werden.Robustes Überspringen von Daten in einem java.io.InputStream und seinen Subtypen
InputStream.skip(long)
nicht viel machen in der Art von Garantien:
Skips über und verwirft n Bytes von Daten aus dem Stream. Das Auslassen-Verfahren kann aus einer Vielzahl von Gründen dazu führen, dass eine kleinere Anzahl von Bytes, möglicherweise 0, übersprungen wird. Dies kann aus einer beliebigen Anzahl von Bedingungen resultieren; Das Erreichen des Dateiendes, bevor n Bytes übersprungen wurden, ist nur eine Möglichkeit. Die tatsächliche Anzahl der übersprungenen Bytes wird zurückgegeben.
Ich muss wissen, dass eines von zwei Dingen passiert:
- Der Strom beendet
- Die Bytes übersprungen wurden
Einfach genug. Die in dieser Beschreibung gewährte Nachsicht bedeutet jedoch, dass beispielsweise BufferedInputStream
einige Bytes überspringen und zurückgeben kann. Sicher, es sagt mir, dass es nur diese wenigen ausgelassen hat, aber es ist nicht klar, warum.
Also meine Frage ist: können Sie InputStream.skip(long)
so verwenden, dass Sie wissen, wenn entweder der Strom endet oder der Übersprung erfolgreich abgeschlossen?
Ihre Antwort konkretisiert, worum es mir ging. Der Code, den ich gepostet habe _seems_, um in der Praxis zu funktionieren, aber ich bin nicht zuversichtlich, dass es für alle Implementierungen von 'InputStream' funktionieren würde. Ihre Erweiterung sieht interessant aus und ich werde sie in Kürze in der Klasse, in der ich sie brauche, ausprobieren. (Https://code.google.com/p/metadata-extractor/source/browse/Source/com/drew/lang/ StreamReader.java). Momentan versucht meine API zu melden, ob der Übersprung erfolgreich war, daher muss ich möglicherweise den Clientcode ändern, wenn keine Garantie möglich ist. Vielen Dank. –
Sie können das 'FileInputStream.skip()' Problem beheben: Verwenden Sie Ihre 'while' Schleife für' n-1' Bytes; Rufen Sie nach der Schleife einmal 'in.read()' auf. Wenn Sie "-1" zurückgeben, wird mit dem Überspringen EOF ausgelöst, andernfalls ist Ihr Überspringen erfolgreich. Vergessen Sie auch nicht, eine 'n == 0 Prüfung oben zu machen. –
@KannanGoundan Interessanter Vorschlag. Ein Nachteil ist natürlich, dass es mindestens zwei Lesungen von dem Strom erfordern würde (ein "Überspringen" plus ein "Lesen"), was in einigen Szenarien die Leistung beeinträchtigen könnte. – leonbloy