Подтвердить что ты не робот

Неожиданный конец потоковой ошибки при загрузке?

Возможный дубликат:
Android: исключение "Неожиданный конец потока" при загрузке больших файлов

Я уменьшаю файл ок. 5MB, используя HttpURLConnection, но наполовину во время downlod, я получаю "неожиданный конец потока" в этой строке моего кода:

                     while ((count = input.read(data)) > 0) {

Здесь находится LOG:

11-20 16:05:55.749: ERROR/PRINTSTACK(3425): STACK:unexpected end of stream
11-20 16:05:55.749: WARN/System.err(3425): java.io.IOException: unexpected end of stream
11-20 16:05:55.749: WARN/System.err(3425):     at org.apache.harmony.luni.internal.net.www.protocol.http.FixedLengthInputStream.read(FixedLengthInputStream.java:47)
11-20 16:05:55.749: WARN/System.err(3425):     at java.io.BufferedInputStream.read(BufferedInputStream.java:319)
11-20 16:05:55.749: WARN/System.err(3425):     at java.io.FilterInputStream.read(FilterInputStream.java:133)
11-20 16:05:55.759: WARN/System.err(3425):     at com.conjure.skiproj.DownloadService$Job.process(DownloadService.java:265)
11-20 16:05:55.759: WARN/System.err(3425):     at com.conjure.skiproj.DownloadService$1.run(DownloadService.java:193)
11-20 16:05:55.759: WARN/System.err(3425):     at java.lang.Thread.run(Thread.java:1019)

Справка!! 1

EDIT: дополнительная информация о коде, настраивающем входной поток:

    HttpURLConnection conexion = (HttpURLConnection)url.openConnection();
                        conexion.setRequestMethod("GET");
                        conexion.setReadTimeout(20000);
                        conexion.connect();
                        File file = new File(root.getAbsolutePath()+"/", fileName);

                             int lenghtOfFile = conexion.getContentLength();

                             InputStream input = new BufferedInputStream(url.openStream());

                             OutputStream output = new FileOutputStream(file);

                             byte data[] = new byte[8192];
...........................

EDIT 2: появилась новая ошибка IndexOutOfBoundsException при 25% загрузки в следующей строке:

  output.write(data, 0, count);

LOG ниже:

11-20 17:47:02.311: ERROR/totaltotal(303): 24
11-20 17:47:02.311: INFO/System.out(303): countcountcount:4332
11-20 17:47:02.330: ERROR/totaltotal(303): 24
11-20 17:47:02.330: INFO/System.out(303): countcountcount:2904
11-20 17:47:02.330: ERROR/totaltotal(303): 25
11-20 17:47:02.330: INFO/System.out(303): countcountcount:1452
11-20 17:47:02.330: ERROR/totaltotal(303): 25
11-20 17:47:02.650: INFO/System.out(303): countcountcount:4356
11-20 17:47:02.650: ERROR/totaltotal(303): 25
11-20 17:47:02.650: INFO/System.out(303): countcountcount:-1
11-20 17:47:02.660: ERROR/totaltotal(303): 25
11-20 17:47:02.892: DEBUG/dalvikvm(303): GC_FOR_MALLOC freed 10770 objects / 490896 bytes in 143ms
11-20 17:47:03.060: ERROR/PRINTSTACK(303): STACK:Arguments out of bounds
11-20 17:47:03.060: WARN/System.err(303): java.lang.IndexOutOfBoundsException: Arguments out of bounds
11-20 17:47:03.070: WARN/System.err(303):     at java.io.FileOutputStream.write(FileOutputStream.java:288)
11-20 17:47:03.080: WARN/System.err(303):     at com.conjure.skiproj.DownloadService$Job.process(DownloadService.java:275)
11-20 17:47:03.080: WARN/System.err(303):     at com.conjure.skiproj.DownloadService$1.run(DownloadService.java:191)
11-20 17:47:03.080: WARN/System.err(303):     at java.lang.Thread.run(Thread.java:1096)

ИЗМЕНИТЬ 3: Я проследил ошибку до класса FixedLengthInputStream, а затем снова вернулся к классу AbstractHttpInputStream, где есть этот метод:

/**
             * Calls abort on the cache entry and disconnects the socket. This
             * should be invoked when the connection is closed unexpectedly to
             * invalidate the cache entry and to prevent the HTTP connection from
             * being reused. HTTP messages are sent in serial so whenever a message
             * cannot be read to completion, subsequent messages cannot be read
             * either and the connection must be discarded.
             *
             * <p>An earlier implementation skipped the remaining bytes, but this
             * requires that the entire transfer be completed. If the intention was
             * to cancel the transfer, closing the connection is the only solution.
             */
            protected final void unexpectedEndOfInput() {
                if (cacheRequest != null) {
                    cacheRequest.abort();
                }
                httpURLConnection.releaseSocket(false);
            }

Таким образом, кажется, что в случае ошибки сообщения Http весь поток загрузки отменяется.

4b9b3361

Ответ 1

Это исключение генерируется FixedLengthInputStream, когда ожидаемое количество байтов (обычно заданное в заголовке длины содержимого ответа) больше, чем фактические данные в ответе. Проверьте правильность заголовка содержимого. (Если вы используете свое значение для длины содержимого, убедитесь, что оно правильно.)

Это поможет увидеть ваш код, который устанавливает входной поток.

Ответ 2

Число 0 допустимо, насколько я понимаю в случае сетевой проблемы. Попробуйте...

while ((count = input.read(data)) != -1) {
    if (count != 0) {
        ...
    }
}