【发布时间】:2009-06-23 16:17:42
【问题描述】:
是否可以使用 NIO 来处理来自 Process 的 stdout?我让它与 java.io 一起工作,但这是一个练习,可以更多地了解 NIO 并探索性能改进的可能性。
基本上,我想尽可能快地将大量文本从标准输出流式传输到缓冲区而不会阻塞,然后再处理该缓冲区的内容。问题是,我似乎无法找到合适的巫术来让它与 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();
}
}
}
【问题讨论】:
-
您想一次简单地将所有标准输入放在一个字节缓冲区中吗?你知道输入流的最大长度吗?
-
我想一次将其读入缓冲区,是的,但长度未知;不过通常在 10 MB 范围内。
标签: java inputstream nio bytebuffer