thể trùng lặp:
Android:“Unexpected end of stream” exception downloading large fileslỗi kết thúc luồng không mong muốn khi tải xuống?
Tôi downloding một file xấp xỉ. 5MB sử dụng HttpURLConnection nhưng nửa đường trong downlod tôi nhận được một "kết thúc bất ngờ của dòng" lỗi ở dòng này của mã của tôi:
while ((count = input.read(data)) > 0) {
Đây là 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)
Help !! 1
EDIT: thông tin thêm về mã lập 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];
...........................
EDIT 2: Got một lỗi IndexOutOfBoundsException mới trên 25% tải trên các dòng sau:
output.write(data, 0, count);
LOG dưới đây:
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)
EDIT 3: tôi bắt nguồn từ lỗi trở lại FixedLengthInputStream và sau đó tiếp tục quay lại lớp AbstractHttpInputStream ở nơi có phương thức này:
/**
* 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);
}
Vì vậy, có vẻ như trong trường hợp lỗi tin nhắn Http toàn bộ luồng tải xuống bị hủy.
Tôi nghi ngờ nó sẽ giúp nhưng hãy thử sử dụng 'InputStream input = conexion.getInputStream();' thay vì sử dụng 'url.openStream()' để tạo một 'BufferedInputStream'. – Squonk
chỉ cần thử này, nó không hoạt động !! – bytebiscuit
BẤT CỨ AI CÓ BẤT K ID CÁCH NÀO ĐỂ LÀM THẾ NÀO ĐỂ GIẢI QUYẾT NÀY, HOẶC BẤT K H GÌ HAY HƯỚNG DẪN !!! – bytebiscuit