2008-09-24 10 views
9

¿Hay una expresión más concisa/estándar (por ejemplo, un método JDK) para "canalizar" una entrada a una salida en Java que la siguiente?Idioma de Java para "tuberías"

 
public void pipe(Reader in, Writer out) { 
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); 
    while(in.read(buf) >= 0) { 
     out.append(buf.flip()); 
     buf.clear(); 
    } 
} 

[EDIT] Tenga en cuenta el Reader y Writer se da . La respuesta correcta demostrará cómo tomar in y out y formar un conducto (preferiblemente con no más de 1 o 2 llamadas a métodos). Aceptaré respuestas donde in y out son InputStream y OutputStream (preferiblemente con una conversión de/a Reader/Writer). No aceptaré respuestas donde in o out es una subclase de Reader/InputStream o Writer/OutputStrem.

+0

posible duplicado de [Forma sencilla de escribir el contenido de un Java InputStream a un OutputStream] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -to-a-outputstream) –

Respuesta

10

del proyecto Apache Commons tiene un número de utilily methods que hace exactamente lo que necesita.

IOUtils.copy(in, out) realizará una copia en búfer de toda la entrada a la salida. Si hay más de un lugar en su base de código que requiere Stream o Reader/Writer manejo, usar IOUtils podría ser una buena idea.

+0

Guau. Apache Commons es un proyecto realmente impresionante. Me rascan las picazones incluso antes de que las note. –

+0

+1 para Apache Commons –

1

Tome un vistazo a java.io.PipedInputStream y PipedOutputStream o PipedReader/PipedWriter del mismo paquete.

De la documentación de PipedInputStream:

Un hilo flujo de entrada debe estar conectado a una corriente de salida de hilo; el flujo de entrada canalizado proporciona, entonces, los bytes de datos que se escriben en el flujo de salida canalizado. Normalmente, los datos se leen de un objeto PipedInputStream por un hilo y los datos se escriben en el PipedOutputStream correspondiente por algún otro hilo. No se recomienda intentar usar ambos objetos de un único subproceso, ya que puede bloquear el hilo. El flujo de entrada canalizado contiene un buffer, desacoplando las operaciones de lectura de las operaciones de escritura, dentro de los límites. Se dice que una tubería está rota si un hilo que estaba proporcionando bytes de datos a la corriente de salida conectada ya no está activa.

+0

¿Hay alguna forma de crear un PipedInputStream a partir de un InputStream (o Reader) dado? –

+0

Creo que puede hacer algo como "nuevo PipedInputStream (theInputStreamInstance)" (es decir, "envolver InputStream con un PipedInputStream). –

+0

Lo siento, salté antes de mirar. :(Parece que no hay forma de tomar una transmisión existente y convertirla en una transmisión por cable. Un PipedInputStream debe estar vinculado a un PipedOutputStream. Si lo desea, puede simplemente transferir bytes de un InputStream a un PipedOutputStream que está vinculado a un PipedInputStream. –

1

La única optimización disponible es a través de FileChannels en la API de NIO: Reads, Writes. La JVM puede optimizar esta llamada para mover los datos de un archivo a un canal de destino sin tener que mover primero los datos al espacio del kernel. Vea this article para más detalles.

+0

¿Cómo puedo obtener un FileChannel de un Reader, Writer, InputStream , o OutputStream? –

Cuestiones relacionadas