Java InputStream-Leseproblem

8

Ich habe eine Java-Klasse, in der ich Daten über einen InputStream einlese

%Vor%

Es funktioniert perfekt, wenn ich meine App von der IDE (Eclipse) aus starte.

Aber wenn ich mein Projekt exportiert habe und es in einem JAR gepackt ist, liest der Lesebefehl nicht alle Daten. Wie könnte ich es beheben?

Dieses Problem tritt meistens auf, wenn der InputStream eine Datei (~ 10kb) ist.

Danke!

    
Michael 28.05.2011, 07:59
quelle

4 Antworten

6

Normalerweise bevorzuge ich beim Lesen aus dem Eingabestream einen Puffer fester Größe. Wie evilone darauf hingewiesen hat, ist die Verwendung von available () als Puffergröße möglicherweise keine gute Idee, denn wenn Sie beispielsweise eine Remote-Ressource lesen, kennen Sie die verfügbaren Bytes möglicherweise nicht im Voraus. Sie können das Javadoc von InputStream lesen erhalten Sie mehr Einblick.

Hier ist das Code-Snippet, das ich normalerweise zum Lesen des Eingabestreams verwende:

%Vor%

Die Version von read (), die ich hier verwende, füllt den gegebenen Puffer so gut wie möglich und Rückgabe Anzahl der tatsächlich gelesenen Bytes. Dies bedeutet, dass der Puffer möglicherweise nachgestellte Daten enthält, weshalb es sehr wichtig ist, nur Bytes bis zu bytesRead zu verwenden.

Beachten Sie die Zeile (bytesRead = in.read(buffer)) >= 0 , in der InputStream-Spezifikation steht nichts darüber, dass read () 0 Bytes nicht lesen kann. Sie müssen möglicherweise den Fall behandeln, wenn read () 0 Bytes als speziell liest Fall abhängig von Ihrem Fall. Für lokale Datei habe ich nie solchen Fall erfahren; Beim Lesen von Remote-Ressourcen habe ich jedoch gesehen, dass read () 0 Bytes liest, was den obigen Code ständig zu einer Endlosschleife führt. Ich habe das Problem mit der Endlosschleife gelöst, indem ich gezählt habe, wie oft ich 0 Bytes gelesen habe. Wenn der Zähler einen Schwellenwert überschreitet, werde ich die Ausnahme auslösen. Sie können dieses Problem nicht auftreten, aber denken Sie daran:)

Ich werde wahrscheinlich aus Performancegründen kein neues Byte-Array für jeden Lesevorgang erstellen.

    
Alvin 28.05.2011, 08:30
quelle
4

read() gibt -1 zurück, wenn der InputStream leer ist. Es gibt auch eine Version von lesen das ein Array nimmt, ermöglicht Ihnen, Chunked Reads zu tun. Er gibt die Anzahl der tatsächlich gelesenen Bytes oder -1 am Ende des InputStreams zurück. Kombinieren Sie dies mit einem dynamischen Puffer wie ByteArrayOutputStream , um Folgendes zu erhalten:

%Vor%

Dies verringert die Anzahl der Methoden, die Sie aufrufen müssen, erheblich und erlaubt ByteArrayOutputStream, seinen internen Puffer schneller zu vergrößern.

    
jackrabbit 28.05.2011 08:11
quelle
3
%Vor%     
evilone 28.05.2011 08:02
quelle
0

Unten ist ein Codeschnipsel, der eine Datei (*. Png, *. Jpeg, *. Gif, ...) herunterlädt und sie in BufferedOutputStream schreibt, der die HttpServletResponse darstellt.

%Vor%

Hoffe, das hilft.

    
Raimundo Espirito Santo 13.09.2013 21:23
quelle

Tags und Links