2011-02-07 16 views
25
FileInputStream in = new FileInputStream(myFile); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 

Pregunta: ¿Cómo puedo leer todo desde in en out de una manera que no es un bucle hecho a mano con mi propio búfer de bytes?¿Cómo leer un flujo en otro?

+0

posible duplicado de [forma sencilla de escribir contenido de una aplicación Java InputStream a un OutputStream] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-insputstream-to-an-outputstream) – rds

Respuesta

30

Escriba un método para hacer esto y llámelo desde cualquier lugar que necesite la funcionalidad. Guava ya tiene el código para esto, en ByteStreams.copy. Estoy seguro de que casi cualquier otra biblioteca con funcionalidad IO "general" también lo tiene, pero Guava es mi primera biblioteca "to-to" cuando es posible. Rocas :)

+0

El 'ByteStreams' se anota como '@ Beta' ¿no es eso un problema? – gabuzo

+2

@gabuzo: Eso depende de cuán arriesgado sea usted. Sospecho que es muy poco probable que la llamada al método cambie, y estoy seguro de que la implementación está bien. –

+1

Incluso si cambia o desaparece, solo corre el riesgo de tener que arreglarlo en caso de que actualice. El método es simple y el código fuente está disponible (incluso como repositorio de subversión). – maaartinus

2

Alternativamente a la guayaba se podría usar Apache Commons IO (antiguo) y Apache Commons IOUtils (nuevo como se indica en el comentario).

+2

* Obsoleto. Use IOUtils. Se eliminará en 2.0. Métodos renombrados a IOUtils.write() o IOUtils.copy() * –

+0

@Sean Patrick Floyd Thanx - han actualizado la respuesta. – 01es

0

que haría uso del bucle, en lugar de importar nueva clases, o agregando bibliotecas a mi proyecto. La función de la biblioteca probablemente también se implemente con un bucle. Pero ese es solo mi gusto personal.

Sin embargo, mi pregunta para usted: ¿qué está tratando de hacer? Piense en la "gran imagen", si quiere poner todo el contenido de un archivo en una matriz de bytes, ¿por qué no hacer eso? El tamaño de la matriz es file.length(), y no la necesita para crecer dinámicamente, oculta detrás de ByteArrayOutputStream (a menos que su archivo sea compartido y su contenido pueda cambiar mientras lo lee).

Otra alternativa: ¿podría usar un FileChannel y un ByteBuffer (java.nio)?

11

Así lo Guava ByteStreams.copy (IN, OUT) hace:

private static final int BUF_SIZE = 0x1000; // 4K 

    public static long copy(InputStream from, OutputStream to) 
     throws IOException { 
    checkNotNull(from); 
    checkNotNull(to); 
    byte[] buf = new byte[BUF_SIZE]; 
    long total = 0; 
    while (true) { 
     int r = from.read(buf); 
     if (r == -1) { 
     break; 
     } 
     to.write(buf, 0, r); 
     total += r; 
    } 
    return total; 
    } 
+0

ver también http://stackoverflow.com/a/22646404/1497139 –

2

En mi proyecto he utilizado este método:

private static void copyData(InputStream in, OutputStream out) throws Exception { 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = in.read(buffer)) > 0) { 
     out.write(buffer, 0, len); 
    } 
} 
+1

Puede ser útil para otros si explica por qué su código es diferente y cómo soluciona el problema –

+0

Tiene razón. Edité mi respuesta. – Sergey

+0

Código conciso y no usa librerías. –

Cuestiones relacionadas