Android 下载时出现意外的流结束错误?

Android 下载时出现意外的流结束错误?,android,Android,可能重复: 我正在使用HttpURLConnection下载一个大约5MB的文件,但是在下载过程的中途,我在代码的这一行遇到了一个“意外的流结束”错误: while ((count = input.read(data)) > 0) { 以下是日志: 11-20 16:05:55.749: ERROR/PRINTSTACK(3425): STACK:unexpected end of stream 11-20 16:05:55.749: WARN

可能重复:

我正在使用HttpURLConnection下载一个大约5MB的文件,但是在下载过程的中途,我在代码的这一行遇到了一个“意外的流结束”错误:

                     while ((count = input.read(data)) > 0) {
以下是日志:

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)
救命!!一,

编辑:有关设置inputstream的代码的更多信息:

    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];
...........................
编辑2:在以下行的25%下载中获得了一个新的错误IndexOutfBoundsException:

  output.write(data, 0, count);
记录如下:

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);
            }
/**
*对缓存项调用abort并断开套接字连接。这
*应在连接意外关闭时调用
*使缓存项无效并阻止HTTP连接
*重复使用。HTTP消息以串行方式发送,因此无论何时
*无法读取完成,无法读取后续消息
*必须放弃和连接中的任何一个。
*
*以前的实现跳过了剩余的字节,但是
*要求完成整个传输。如果意图是
*要取消传输,关闭连接是唯一的解决方案。
*/
受保护的最终无效未预期的DoFinPut(){
if(cacheRequest!=null){
cacheRequest.abort();
}
httpURLConnection.releaseSocket(false);
}

因此,在出现Http消息错误的情况下,整个下载流似乎被取消。

据我所知,在网络出现问题的情况下,允许计数为0。试试看

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

当预期字节数(通常在响应的content length标头中设置)大于响应中的实际数据时,FixedLengthinInputStream会引发该异常。检查内容长度标题是否正确。(如果要为内容长度提供自己的值,请确保该值正确。)


查看设置输入流的代码会有所帮助。

刚刚编辑了我的问题。提供了更多信息。看起来内容长度标题仍然错误。此外,如果您所做的只是读取数据并将其转储到文件中,则不需要将输入流包装到BufferedInputStream中。您已经在使用自己的缓冲区,而这样的双缓冲只会增加开销。它应该不会影响任何东西,但是试着去掉包装器。内容长度很好,我得到的文件大小正确,是5171472(~5.2MB)。这很奇怪,因为它只会停止50%-80%的下载process@user967232-很奇怪。如果您重复相同的下载,在失败之前是否会到达不同的点?代理或其他东西可能会过早地关闭下载流吗?我认为这里不应该允许0。来自:如果b的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值-1;否则,至少有一个字节被读取并存储到b中。@Ted:好的,我同意文档中的说法,但我的一个测试人员在我的应用程序下载一些文件时失败了,我遇到了一个问题。他本人是一名Java程序员,他建议我按照上面的回答构造代码。他建议,当与网络流关联时,可能会返回0字节。它修复了他的下载失败。此外,在本例中,这是一个没有意义的问题,因为它没有解决OP的问题。我怀疑它是否有帮助,但请尝试使用
InputStream input=conexion.getInputStream()
而不是使用
url.openStream()
来创建
BufferedInputStream
。只是尝试了一下,它不起作用!!任何人都知道如何解决这个问题,或者有任何提示或指示!!!