不阻塞地从输入流中读取数据

4

我有几个InputStream需要以非阻塞的方式读取。以下是示例:

public Result getResult(InputStream ... inputStreams) {
    final Result result = new Result();

    for (InputStream stream : inputStreams) {
        // TODO: read input streams without blocking here
        // write output using result.log.add(...) when it gets to a \n (newline)
    }

    return result;        
}

public class Result {
    public final Collection<String> log = new ConcurrentLinkedDeque<>();
}

我可以通过以下方式为每个InputStream开启一个新线程:

new Thread(() -> { // TODO: 在此读取 }).start()

甚至可以使用ExecutorService,但我宁愿不自己启动线程,而是让JDK来管理。这种做法是否可能?

(我有一个进程,根据请求打印Result.log。)


@A4L - 我不想自己管理线程,无论是通过新线程还是线程池...如果可能的话,我希望由JDK来完成。 - Cheetah
你正在使用什么类型的“InputStream”?文件、网络? - axtavt
@axtavt - 可能是任何东西,但大多数情况下会像网络一样表现...间歇性的流,但最终会完成。 - Cheetah
为什么?您是否有轮询这些流的特定要求?按特定顺序?无论每个流的活动率如何? - user207421
与需求无关...我不需要一个顺序,我想我正在寻找的是一个“事件驱动”的InputStream,在其中所有线程和轮询都由JDK为我处理。 - Cheetah
对于其他用例(从InputStream中读取所有可用数据),我发现这个问题很有用:https://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-inputstream-with-a-timeout - undefined
1个回答

1
你可以使用类似 AsynchronousFileChannel 的方法来部分实现。这有助于避免等待文件读取,一旦文件被读取,JDK 将调用提供的 CompletionHandlercomplete 方法(根据需要编写自己的方法)。complete 方法以异步方式运行,但 javadoc 建议确保它尽可能高效地运行,以防止在其他文件上阻塞(如果您需要同时生成多个 Result 实例,这可能是一个问题)。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接