-3

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

我正在使用的 http 库公开了一个类似于 OnCharReceived(CharBuffer buffer) 的方法,该方法可以被覆盖,这样我就可以有效地处理传入的每个数据块。

我想将此数据公开为 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

4

1 回答 1

1

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

根据您使用的 API,可能还有其他解决方案,但由于上述原因,我认为建议的解决方案仍然有意义。

于 2016-07-31T03:43:05.477 回答