435 votos

Manera fácil de escribir el contenido de un InputStream Java a un OutputStream

Me sorprendió encontrar hoy en día de que no podía seguir la pista de cualquier forma sencilla para escribir el contenido de un InputStream a OutputStream en Java. Obviamente, el búfer de bytes de código no es difícil de escribir, pero sospecho que me estoy perdiendo algo que haría mi vida más fácil (y el código más claro).

Así, dado un InputStream in y OutputStream out, hay una forma más simple de escribir el siguiente?

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
}

395voto

Mikezx6r Puntos 6541

Como WMR mencionado, org.apache.commons.io.IOUtils de Apache tiene un método llamado copy(InputStream,OutputStream) que hace exactamente lo que estás buscando.

Así que tienes:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);

.. .en su código.

¿Hay una razón por la que estás evitando IOUtils ?

322voto

user1079877 Puntos 703

Si está utilizando Java7, los archivos es el mejor (no requieren ninguna librería adicional):

/* You can get Path from file also: file.toPath() */
Files.copy(InputStream in, Path target)
Files.copy(Path source, OutputStream out)

EDIT: por supuesto es útil sólo cuando se crea uno de InputStream o OutputStream del archivo. Uso file.toPath() obtener la ruta del archivo.

100voto

Mike Stone Puntos 21293

Creo que esto funcione, pero asegúrese de poner a prueba lo menor "mejora", pero podría ser un poco de un costo de legibilidad.

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
    out.write(buffer, 0, len);
}

17voto

Dilum Ranatunga Puntos 7677

PipedInputStream y PipedOutputStream debe ser utilizado solamente cuando usted tiene varios subprocesos, como lo señaló el javadoc.

También tenga en cuenta que los flujos de entrada y flujos de salida no envuelva cualquier hilo interrupciones con IOExceptions... Entonces usted debería considerar la posibilidad de incorporar una política de interrupción en el código:

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}

Esta sería una adición útil si usted espera utilizar esta API para copiar grandes volúmenes de datos, o los datos de los arroyos que se atascan por un intolerablemente largo tiempo.

8voto

WMR Puntos 5869

No hay ninguna manera de hacerlo mucho más fácil con métodos de JDK, pero como ya ha señalado Apocalisp, no eres el único con esta idea: puede usar IOUtils de Jakarta Commons IO, también tiene un montón de otras cosas útiles, que OMI debería ser en realidad parte de JDK...

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X