gpt4 book ai didi

java - 是否可以将 Process stdout InputStream 读取到 NIO ByteBuffer 中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:05 25 4
gpt4 key购买 nike

是否可以使用 NIO 来处理来自进程的标准输出?我让它与 java.io 一起工作,但这是一种练习,可以更多地了解 NIO 并探索性能改进的可能性。

基本上,我想尽可能快地将大量文本从 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();
}
}
}

最佳答案

我创建了一个开源库,它允许在 java 和您的子进程之间进行非阻塞 I/O。该库提供了一个事件驱动的回调模型。它依赖于 JNA 库来使用特定于平台的 native API,例如 Linux 上的 epoll、MacOS X 上的 kqueue/kevent 或 Windows 上的 IO Completion Ports。

项目名为NuProcess可以在这里找到:

https://github.com/brettwooldridge/NuProcess

关于java - 是否可以将 Process stdout InputStream 读取到 NIO ByteBuffer 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1033653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com