È possibile utilizzare NIO per elaborare lo stdout da un processo? Ho lavorato con java.io, ma questo è un esercizio per imparare un po 'di più su NIO e per esplorare la possibilità di migliorare le prestazioni.È possibile leggere il Process stdout InputStream in un ByteBuffer NIO?
In pratica, voglio eseguire il flusso di un grande volume di testo da stdout in un buffer il più velocemente possibile senza bloccare e quindi elaborare il contenuto di tale buffer in un secondo momento. Il problema è che non riesco a capire il giusto voodoo per farlo funzionare con NIO. Questo è dove mi trovo ora:
ProcessBuilder pb = new ProcessBuilder(...);
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
Lo StreamConsumer classe si presenta così:
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();
}
}
}
Vuoi avere semplicemente tutto lo standard input in un buffer singolo byte in una volta? Conosci una lunghezza massima del flusso di input? –
Mi piacerebbe leggerlo in un buffer tutto in una volta si, ma la lunghezza è sconosciuta; tipicamente nella gamma di 10 MB però. – Rob