2010-10-31 17 views
6

Me gustaría saber cómo hacer una copia profunda de un InputStream.Cómo hacer una copia profunda de un InputStream en Java

Sé que se puede hacer con paquetes IOUtils, pero me gustaría evitarlos si es posible. ¿Alguien sabe de una manera alternativa?

+0

¿Por qué quieres hacer eso? Afaik no se puede leer dos veces de una secuencia. – thejh

+0

Por alguna extraña razón, creo que mi transmisión se consume una vez que la usé. Entonces, para asegurar que ese no es el caso, me gustaría hacer una copia profunda. Estoy trabajando con Android y obteniendo imágenes de un servicio web usando la arquitectura REST. – Spredzy

+4

¿Por qué no nos muestra el código relevante y explica el problema real que tiene? –

Respuesta

16

InputStream es abstracto y no expone (ni sus hijos) los objetos de datos internos. Entonces, la única forma de "copiar profundamente" el InputStream es crear ByteArrayOutputStream y luego de leer() en InputStream, escribir() estos datos en ByteArrayOutputStream. A continuación, hacer:

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

Si está utilizando mark() en su InputStream entonces ciertamente no se puede revertir esto. Esto hace que tu flujo "se consuma".

Para "reutilizar" su InputStream evite el uso de la marca() y luego, al final de la lectura, restablezca la llamada(). Estarás leyendo desde el comienzo de la transmisión.

Editado:

Por cierto, IOUtils utiliza este sencillo fragmento de código para copiar 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; 
} 

Leer más: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m

+0

¿qué DEFAULT_BUFFER_SIZE du us usualmente usas con este método? –

Cuestiones relacionadas