在初始化GZIPInputStream之后,我可以使用实体响应吗



我的程序正在读取这个大的gzip文件,它运行了一个小时左右,但由于以下堆栈跟踪而失败:

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:212)
at org.apache.http.impl.conn.LoggingSessionInputBuffer.read(LoggingSessionInputBuffer.java:82)
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:182)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.trainchaser.feed.connections.StaticConnect.getScheduleFile(StaticConnect.java:116)
at com.trainchaser.app.App.main(App.java:32)

其中线CCD_ 1是下面代码中的while循环。

我读过类似的帖子,在阅读完while循环后,我确实关闭了阅读器(in),但它仍然给了我同样的错误。所以我想,如果我消费实体,它可能会起作用,比如:

HttpEntity entity=getResponse.getEntity();
BufferedReader in = new BufferedReader(new InputStreamReader(
new GZIPInputStream(entity.getContent())));
EntityUtils.consumeQuietly(entity);
try
{
while ((content = in.readLine()) != null)
{...

这样行吗?我在想,如果我暂时存储gzip文件,而不连续分配连接,可能会有助于防止错误。我会自己测试它,但我目前正在测试关闭防火墙的修复程序,看看它是否仍然出错。

如果org.apache.http.HttpEntity有助于,我将使用它

我快速扫描了Apache 4.x HTTP库的源代码,但我看不到任何会导致此调用的内容:

consumeQuietly(entity);

失败。然而,consumeQuietly调用将关闭底层输入流。。。从你的in流的脚下。如果你继续阅读in,你的代码会得到一个IOException。。。下次它需要填充缓冲区。

然而,我怀疑这并不能解释你所看到的例外情况。如果我对BufferedReader代码的阅读是正确的,那么你会看到IOException("stream closed"),而不是StaticConnect.getScheduleFile(StaticConnect.java:116)0。

无论哪种方式,在"消耗"实体之后继续使用in似乎都是个坏主意。


初始化BufferedReader后,我可以使用实体响应吗?

这是另一个问题。是的,你可以做到。

问题在于你在使用回复后对读者做了什么。如果你做了什么而不是关闭它,你就是在找麻烦。。。IMO.


顺便说一句,Apache HTTP库的源代码和核心Java IO类都是免费提供的。了解他们行为的最好方法是阅读源代码。。。就像我一样。

相关内容

  • 没有找到相关文章

最新更新