Java中无界的PipedInputStream

时间:2016-07-31 03:33:05

标签: java concurrency pipe inputstream apache-httpasyncclient

我正在使用http库来获取大小为200 mb的数据。然后处理数据中的每一行。为了节省内存,我希望在数据流传输时逐行处理数据,而不是等待首先下载所有200 MB的数据。

我正在使用的http库公开了一个类似于OnCharReceived(CharBuffer缓冲区)的方法,可以覆盖它,这样我就可以实际处理每个数据块。

我想将此数据公开为InputStream。我的第一个想法是使用PipedInputStream和PipedOutputStream对,在OnCharReceived()中我会写入PipedOutputStream并在我的线程中从PipedInputStream读取。但是,这似乎存在这样的问题:管道的底层缓冲区可能已满,要求写入线程在OnCharReceived中阻塞,直到我的线程绕过处理数据。但是在OnCharReceived中阻塞可能会在http库的IO线程中阻塞,并且非常糟糕。

那里有Java类来处理我需要在这里解决的抽象问题而不必我自己的自定义实现。我知道像BlockingQueue这样可以用作更大解决方案的一部分。但是有没有简单的解决方案。

由于遗留代码的原因,我确实需要将数据公开为InputStream。

编辑:更准确地说,我的代码基于apache http async库中的以下示例

https://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java

1 个答案:

答案 0 :(得分:1)

如果有一个更简单的解决方案,我就不会接近Piped[In/Out]putStream。正如您所指出的,它引入了不必要的复杂线程问题。请记住,您始终可以写入临时文件,然后从文件中读取InputStream。这也具有尽可能快地关闭HTTP连接并避免超时的优点。

根据您使用的API,可能还有其他解决方案,但我认为所提出的解决方案仍然有道理。