2016-01-29 14 views
10

Występuje problem podczas zapisywania dużego pliku wideo przy użyciu funkcji httpurlconnection.Wyjątek java.io.IOException: nieoczekiwany koniec strumienia

java.io.IOException: unexpected end of stream on Connection{192.1.4.55, [email protected] hostAddress=192.1.4.55 cipherSuite=none protocol=http/1.1} (recycle count=0) 
W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:210)W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:904) 
W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:788) 
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:443) 
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388) 
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:501) 

kod odpowiedzi jest tutaj

final InputStream is = connection.getInputStream(); 
      final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      final byte[] buffer = new byte[maxBufferSize]; 
      int bytesRead; 
      while ((bytesRead = is.read(buffer, 0, 1024)) != -1) { 
       bytes.write(buffer, 0, bytesRead); 
      } 
      log.log(INFO, 
        format("{0} took {4} ms", url, 
          (currentTimeMillis() - start))); 
      String response = new String(bytes.toByteArray()); 
+0

długie procesy powinny zostać przeniesione do osobnego wątku –

+0

Serwer niespodziewanie zamknął połączenie zamiast wysyłać odpowiedź. Czy na pewno prośba była poprawna? – EJP

+0

tak, działa idealnie na rozmiar pliku <5 MB. ale wyrzucanie powyżej błędu, gdy rozmiar pliku jest duży. – JosephM

Odpowiedz

-3

Proszę używać BufferedInputStream i BufferedOutputStream do buforowania danych dla większych plików

+1

Jak to rozwiąże problem? – EJP

-3

nadzieję, że ten kod pomoże.

+2

Masz nadzieję, że dlaczego? – EJP

-3

Czasami ten wyjątek można zignorować, może być konieczne ponowne wykonanie.
np. użyj charles proxy telefon komórkowy wifi, pobierz plik, charles Zakończ to połączenie, otrzymasz taki sam wyjątek.

1

Sprawdź, czy używasz OkHttpClient, tutaj jest parametr retryOnConnectionFailure (false). Domyślnie jest to wartość false, po prostu sprawiasz, że to prawda, a następnie błąd zostanie usunięty. Mam nadzieję, że mam ten sam problem i rozwiązuję go po prostu.

OkHttpClient client = new OkHttpClient.Builder() 
    .retryOnConnectionFailure(true) 
    .build(); 
Powiązane problemy