Java 在初始化GZIPInputStream之后,我可以使用实体响应吗?
我的程序正在读取这个大的gzip文件,它运行了一个小时左右,但由于以下堆栈跟踪而失败:Java 在初始化GZIPInputStream之后,我可以使用实体响应吗?,java,gzip,socketexception,httpentity,Java,Gzip,Socketexception,Httpentity,我的程序正在读取这个大的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.Input
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)
其中,lineStaticConnect.getScheduleFile(StaticConnect.java:116)
是下面代码中的while循环
我也读过类似的帖子,在读完while循环后,我确实关闭了阅读器(中的),但它仍然给了我同样的错误。所以我想,如果我消费实体,它可能会工作,就像这样:
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);
失败。但是,调用将关闭底层输入流。。。从流中的脚下。如果您继续阅读
中的,您的代码将得到一个IOException
。。。下次它需要填充缓冲区时
然而,我怀疑这并不能解释你所看到的例外情况。如果我对BufferedReader
代码的读取正确,您将看到IOException(“流关闭”)
,而不是SocketException
无论哪种方式,在“消费”实体后继续在
中使用似乎是个坏主意
在初始化实体响应后,我可以使用它吗BufferedReader
那是另一个问题。是的,你能做到
问题在于,在使用响应后,如何处理读取器。如果你做的不是关闭它,而是自找麻烦。。。国际海事组织
顺便说一下,ApacheHTTP库的源代码和核心JavaIO类都是免费提供的。了解他们将如何表现的最好方法是阅读源代码。。。和我一样。告诉我们您使用的是哪个http库怎么样?@StephenC,谢谢,我已经相应地编辑了这个问题。啊,好的,谢谢。看来java.net.SocketException的问题在于我是如何将数据从文件插入数据库的。。它花了很长时间,所以它最终重置了它。它被修复了,所以我使用spring事务