¿Es posible usar NIO para procesar el stdout de un proceso? Lo tengo trabajando con java.io, pero esto es algo así como un ejercicio para aprender un poco más sobre NIO y explorar la posibilidad de mejoras en el rendimiento.¿Es posible leer el proceso stdout InputStream en un NIO ByteBuffer?
Básicamente quiero transmitir un gran volumen de texto de stdout a un búfer lo más rápido posible sin bloquear, y luego procesar el contenido de ese búfer más tarde. El problema es que parece que no puedo encontrar el vudú adecuado para que funcione con NIO. Aquí es donde estoy ahora:
ProcessBuilder pb = new ProcessBuilder(...);
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
El StreamConsumer clase tiene este aspecto:
class StreamConsumer implements Runnable
{
private InputStream is;
public StreamConsumer(InputStream is)
{
this.is = is;
}
public void run()
{
try
{
ReadableByteChannel source = Channels.newChannel(is);
// Is it possible get a channel to a ByteBuffer
// or MappedByteBuffer here?
WritableByteChannel destination = ??;
ByteBuffer buffer = ByteBuffer.allocateDirect(128 * 1024);
while (source.read(buffer) != -1)
{
buffer.flip();
while (buffer.hasRemaining())
{
destination.write(buffer);
}
buffer.clear();
}
source.close();
destination.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
es lo que quieres simplemente tener toda la entrada estándar en una sola memoria intermedia de bytes a la vez? ¿Conoces la duración máxima de la secuencia de entrada? –
Me gustaría leerlo en un buffer de una vez sí, pero la longitud es desconocida; típicamente en el rango de 10 MB sin embargo. – Rob