2014-02-16 2 views
0

Моя программа читает этот большой файл GZIP и работает в течение часа и так и не удается с помощью следующей трассировки стека:Могу ли я использовать ответ объекта после инициализации GZIPInputStream?

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) 

, где линия StaticConnect.getScheduleFile(StaticConnect.java:116) является цикл в то время как в коде ниже.

Я читал подобные сообщения, и я закрываю читателя (in) после того, как он прочитал цикл 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, если это помогает

+0

Как насчет того, чтобы сообщить нам, какую библиотеку http вы используете? –

+0

@ StephenC, спасибо, я отредактировал вопрос соответствующим образом. – obsessiveCookie

ответ

0

Я имел быстрое сканирование 4.x HTTP Исходный код библиотеки Apache, и я не вижу ничего, что вызвало бы этот призыв:

 consumeQuietly(entity); 

к потерпеть неудачу. Тем не менее, вызов consumeQuietly собирается закрыть основной поток ввода ... из-под ног вашего потока in. Если вы продолжаете читать с in, ваш код будет получать IOException ... в следующий раз ему нужно будет заполнить его буфер.

Тем не менее, я подозреваю, что это не объясняет исключение, которое вы видите. Если мое чтение кода BufferedReader верное, вы увидите IOException("stream closed"), а не SocketException.

В любом случае, продолжая использовать in после того, как вы «потребляете», сущность кажется плохой идеей.


Могу ли я потребляю ответ лица после того, как она инициализируется BufferedReader?

Это другая проблема. Да, вы можете это сделать.

Проблема заключается в том, что вы делаете с читателем после употребления ответа. Если вы делаете что-то другое, кроме закрытия, вы просите о неприятностях ... ИМО.


К слову, исходный код для HTTP-библиотек Apache и основных классов Java IO доступны. Лучший способ понять, как они будут себя вести, - это прочитать исходный код ... точно так же, как я.

+0

Ах, ладно спасибо. Он выглядит проблемой с java.net.SocketException: Сброс соединения заключается в том, как я вставлял данные из файла в db .. он занимал так много времени, поэтому он в конечном итоге перезагружал его. Это было исправлено, если я использовал весеннюю транзакцию – obsessiveCookie

Смежные вопросы