2010-10-31 5 views
6

Vorrei sapere come eseguire una copia profonda di InputStream.Come eseguire una copia profonda di un InputStream in Java

So che può essere fatto con pacchetti IOUtils, ma vorrei evitarli se possibile. Qualcuno conosce un modo alternativo?

+0

Perché vuoi farlo? Afaik non puoi leggere due volte da un flusso. – thejh

+0

Per qualche strana ragione penso che il mio stream venga consumato una volta che l'ho usato. Quindi per far sì che non sia il caso vorrei fare una copia profonda. Sto lavorando con Android e ottenendo immagini da un webservice usando l'architettura REST. – Spredzy

+4

Perché non ci mostri il codice pertinente e spieghi il problema reale che stai riscontrando? –

risposta

16

InputStream è astratto e non espone (né i propri figli) oggetti di dati interni. Pertanto, l'unico modo per "copiare in profondità" InputStream è creare ByteArrayOutputStream e, dopo aver eseguito read() su InputStream, scrivere() questi dati su ByteArrayOutputStream. Poi fare:

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

Se si utilizza mark() sul InputStream allora davvero non si può invertire questo. Questo rende il tuo flusso "consumato".

Per "riutilizzare" InputStream evitare l'uso di mark() e quindi alla fine della lettura della chiamata reset(). Potrai quindi leggere dall'inizio del flusso.

Modificato:

BTW, IOUtils utilizza questo semplice frammento di codice da copiare InputStream:

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; 
} 

Per saperne di più: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m

+0

cosa DEFAULT_BUFFER_SIZE di solito usi con questo metodo? –