是否可以使用NIO來處理來自進程的stdout?我已經與java.io一起工作,但這是一個練習,可以學習更多關於NIO的知識,並探討性能改進的可能性。是否可以將進程stdout InputStream讀入NIO ByteBuffer?
基本上我希望儘可能快地將大量文本從stdout流入緩衝區而不會阻塞,然後稍後處理該緩衝區的內容。麻煩的是,我似乎無法弄清楚正確的巫術使它與NIO合作。這就是我現在:
ProcessBuilder pb = new ProcessBuilder(...);
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
類StreamConsumer看起來是這樣的:
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();
}
}
}
你想簡單地在一個單字節緩衝區中的所有標準:以一次投入?你知道輸入流的最大長度嗎? – 2009-06-23 16:24:38
我想一次將它讀入緩衝區,但是長度未知;通常在10 MB範圍內。 – Rob 2009-06-23 18:10:02