2011-11-20 96 views
10

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.

+0

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

+0

chỉ cần thử này, nó không hoạt động !! – bytebiscuit

+1

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

Trả lời

0

Số lượng 0 được cho phép theo như tôi hiểu trong trường hợp có sự cố mạng. Hãy thử ...

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

nope vẫn có lỗi: S – bytebiscuit

+0

Tôi không nghĩ rằng 0 nên được cho phép ở đây. Từ [tài liệu cho InputStream] (http://download.oracle.com/javase/6/docs/api/): _Nếu độ dài b bằng 0, thì không có byte nào được đọc và 0 được trả về; nếu không, có một nỗ lực để đọc ít nhất một byte. Nếu không có byte nào vì luồng nằm ở cuối tệp, giá trị -1 được trả về; nếu không, ít nhất một byte được đọc và lưu vào b._ –

+0

@Ted: OK, tôi đồng ý với bạn từ những gì tài liệu nói nhưng tôi gặp sự cố với một trong những người thử nghiệm beta bị lỗi khi ứng dụng của tôi đang tải xuống một số tệp . Một lập trình viên Java, ông đề nghị tôi cấu trúc mã của tôi như trong câu trả lời của tôi ở trên. Ông đề nghị rằng một sự trở lại 0 byte có thể xảy ra khi được kết hợp với một luồng mạng. Nó đã sửa lỗi tải xuống của anh ấy.Bên cạnh đó, trong trường hợp này, đó là điểm moot vì nó không khắc phục được vấn đề của OP. – Squonk

8

ngoại lệ đó được ném bởi FixedLengthInputStream khi số lượng dự kiến ​​của byte (thường được thiết lập trong tiêu đề nội dung có độ dài của phản ứng) là lớn hơn so với số liệu thực tế trong các phản ứng. Kiểm tra xem tiêu đề nội dung có độ dài chính xác không. (Nếu bạn đang cung cấp giá trị của riêng mình cho độ dài nội dung, hãy đảm bảo rằng giá trị này chính xác.)

Sẽ giúp bạn xem mã của bạn thiết lập luồng đầu vào.

+0

Chỉ cần chỉnh sửa câu hỏi của tôi. Cung cấp thêm một số thông tin. – bytebiscuit

+0

Dường như tiêu đề nội dung có độ dài không chính xác. Ngoài ra, nếu tất cả những gì bạn đang làm là đọc dữ liệu và bán nó vào một tệp, bạn không cần phải quấn luồng đầu vào vào BufferedInputStream. Bạn đã sử dụng bộ đệm của riêng bạn và đệm đôi như vậy chỉ cần thêm phí. Nó sẽ không ảnh hưởng đến bất cứ điều gì, nhưng cố gắng loại bỏ wrapper đó. –

+0

độ dài nội dung là tốt, tôi nhận được kích thước chính xác của tập tin mà 5171472 (~ 5.2MB) – bytebiscuit

Các vấn đề liên quan