Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的无界PipedInputStream_Java_Concurrency_Pipe_Inputstream_Apache Httpasyncclient - Fatal编程技术网

Java中的无界PipedInputStream

Java中的无界PipedInputStream,java,concurrency,pipe,inputstream,apache-httpasyncclient,Java,Concurrency,Pipe,Inputstream,Apache Httpasyncclient,我正在使用http库获取大小为200 mb的数据。然后处理数据中的每一行。为了节省内存,我希望在数据流入时逐行处理数据,而不是等待所有200 mb的数据首先被下载 我使用的http库公开了一个类似OnCharReceived(CharBuffer buffer)的方法,该方法可以被覆盖,这样我就可以在数据块进入时处理它 我想将此数据作为InputStream公开。我的第一个想法是使用PipedInputStream和PipedOutputStream对,在OnCharReceived()中,我将

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

我使用的http库公开了一个类似OnCharReceived(CharBuffer buffer)的方法,该方法可以被覆盖,这样我就可以在数据块进入时处理它

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

有没有Java类可以处理我需要在这里解决的抽象问题,而不必使用自己的自定义实现。我知道可以将BlockingQueue作为更大解决方案的一部分。但是有什么简单的解决办法吗

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

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


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


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

您在小题大做。只要使用
URL.openStream()
或库中的任何等价物,如果确实需要使用该库的话。使用回调并试图将其转换回流以供另一个线程使用只会浪费时间和空间。@EJP如果一个小型库能够解决解密问题,则是合理的,例如,在这种情况下,他必须与该库提供的任何API集成。请“准确地说,编辑”,你不应该做这种事。该库已经公开了一个
InputStream
。使用它。@Dici你的观点我不明白。我没有说他使用图书馆是没有道理的。我没有这方面的任何信息,你也没有。原来他使用的是Apache HTTP客户端,该客户端肯定会公开一个
InputStream
接口,因此他肯定会使用该接口。@EJP在Apache HTTP异步客户端库中的何处可以看到该InputStream?