从InputStream读取而不阻塞

时间:2014-06-30 14:26:57

标签: java nio

我想以非阻塞的方式阅读一些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: read here }).start()

甚至使用ExecutorService但我不想自己启动线程并由JDK管理。这样的事情可能吗?

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

2 个答案:

答案 0 :(得分:1)

您可以使用AsynchronousFileChannel等部分执行此操作。这有助于您不必等待文件读取,一旦读取文件,JDK将调用提供的CompletionHandlercomplete方法(编写您自己的方法以满足需要)上市)。 complete方法异步运行,但javadoc确实建议您确保它尽可能高效地运行以防止阻塞其他文件(如果您需要生成Result的多个实例,这可能是个问题一段时间。

希望这有帮助。

答案 1 :(得分:0)

您可以使用BufferedInputStream及其read(byte[] b,int off, int len),因为它是非阻塞的。如果只想读取一个字节,则使用字节[1]。

这解决了读取非阻塞的问题。但是你仍然有另一个:你想同时为多个流做这个,你想要返回结果。 AFAIK没有简单的方法可以摆脱这种局面。您将必须创建并启动多个线程,保留引用并等待所有线程加入。