Pregunta

¿Existe un idioma más conciso / estándar (por ejemplo, un método JDK) para " tubería " 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 Reader y Writer están dados . La respuesta correcta mostrará cómo tomar in y out y formar un conducto (preferiblemente con no más de 1 o 2 llamadas de métodos). Aceptaré las respuestas donde in y out son un InputStream y un OutputStream (preferiblemente con una conversión de / a Reader / Writer ). No aceptaré respuestas en las que in o out es una subclase de Reader / InputStream o Writer / OutputStrem .

¿Fue útil?

Solución

IOUtils del proyecto Apache Commons tiene un número de métodos útiles que hacen exactamente lo que necesita.

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

Otros consejos

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

De la documentación de PipedInputStream:

Un flujo de entrada canalizado debe estar conectado a un flujo de salida canalizado; el flujo de entrada canalizado proporciona los bytes de datos que se escriben en el flujo de salida canalizado. Normalmente, los datos se leen desde un objeto PipedInputStream por un hilo y los datos se escriben en el PipedOutputStream correspondiente por otro hilo. No se recomienda intentar usar ambos objetos desde un solo hilo, ya que puede bloquear el hilo. El flujo de entrada canalizado contiene un búfer que desacopla las operaciones de lectura de las operaciones de escritura, dentro de los límites. Se dice que una tubería está rota si una hebra que proporcionaba bytes de datos a la corriente de salida conectada conectada ya no está viva.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top