2010-10-31 8 views
6

Ich würde gerne wissen, wie man eine tiefe Kopie von InputStream machen kann.Wie man eine tiefe Kopie eines InputStream in Java macht

Ich weiß, dass es mit IOUtils-Paketen gemacht werden kann, aber ich möchte sie vermeiden, wenn möglich. Kennt jemand einen alternativen Weg?

+0

Warum Sie das tun wollen? Afaik kann man nicht zweimal aus einem Stream lesen. – thejh

+0

Aus irgendeinem seltsamen Grund denke ich, dass mein Stream konsumiert wird, sobald ich es benutzt habe. Um das nicht zu tun, möchte ich eine tiefe Kopie machen. Ich arbeite mit Android und bekomme Bilder von einem Webservice mit REST-Architektur. – Spredzy

+4

Warum zeigen Sie uns nicht den relevanten Code und erklären das eigentliche Problem, das Sie haben? –

Antwort

16

InputStream ist abstrakt und stellt keine internen Datenobjekte zur Verfügung (auch keine untergeordneten Elemente). Die einzige Möglichkeit, den InputStream "tief zu kopieren", besteht darin, ByteArrayOutputStream zu erstellen, und nach dem Lesen von InputStream diese Daten in ByteArrayOutputStream zu schreiben. Dann tun:

newStream = new ByteArrayInputStream(byteArrayOutputStream.toArray()); 

Wenn Sie mark() auf Ihrem Input verwenden dann in der Tat kann man das nicht rückgängig machen. Dadurch wird Ihr Stream "verbraucht".

Um Ihren InputStream "wiederzuverwenden", vermeiden Sie die Verwendung von mark() und dann am Ende des Lesens Call Reset(). Sie werden dann vom Anfang des Streams lesen.

Edited:

BTW, IOUtils verwendet diesen einfachen Code-Schnipsel Input kopieren:

public static int copy(InputStream input, OutputStream output) throws IOException{ 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    int count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 

mehr lesen: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m

+0

Was DEFAULT_BUFFER_SIZE du normalerweise mit dieser Methode verwendest? –