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
Warum Sie das tun wollen? Afaik kann man nicht zweimal aus einem Stream lesen. – thejh
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
Warum zeigen Sie uns nicht den relevanten Code und erklären das eigentliche Problem, das Sie haben? –