java io pipe

Idioma de Java para "piping"



pipe (3)

¿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?

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

[EDITAR] Tenga en cuenta que el Reader y el Writer se dan . La respuesta correcta demostrará cómo entrar y out y formar una tubería (preferiblemente con no más de 1 o 2 llamadas a métodos). Aceptaré las respuestas donde entran y out un InputStream y un OutputStream (preferiblemente con una conversión de / a Reader / Writer ). No aceptaré respuestas donde, ya sea in o out es una subclase de Reader / InputStream o Writer / OutputStrem .


Eche un vistazo a java.io.PipedInputStream y PipedOutputStream , o PipedReader / PipedWriter desde el mismo paquete.

De la documentación de PipedInputStream:

Una corriente de entrada por tubería debería estar conectada a una corriente de salida por tubería; 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.


La única optimización disponible es a través de FileChannels en la API de NIO: lee , escribe . 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. Ver este artículo para más detalles.


IOUtils del proyecto Apache Commons tiene una serie de métodos que hacen exactamente lo que necesita.

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