title: unexpected end of stream error on download?
body: <blockquote>
    <p><strong>Possible Duplicate:</strong><br>
    <a href="https://stackoverflow.com/questions/7402500/androidunexpected-end-of-stream-exception-downloading-large-files">Android:&ldquo;Unexpected end of stream&rdquo; exception downloading large files</a>  </p>
  </blockquote>
  
  
  
  <p>I'm downloding a file of approx. 5MB using HttpURLConnection but half way during the downlod i get an <strong>"unexpected end of stream"</strong> error at this line of my code:</p>
  
  <pre><code>                     while ((count = input.read(data)) &gt; 0) {
  </code></pre>
  
  <p>Here is the LOG:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Help !!1</p>
  
  <p>EDIT: more info on the code setting up the inputstream:</p>
  
  <pre><code>    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];
  ...........................
  </code></pre>
  
  <p>EDIT 2: Got a new error IndexOutOfBoundsException on 25% of download on the following line:</p>
  
  <pre><code>  output.write(data, 0, count);
  </code></pre>
  
  <p>LOG below:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p><strong>EDIT 3:</strong>
  I traced the error back to FixedLengthInputStream class and then further back to AbstractHttpInputStream class in where there is this method: </p>
  
  <pre><code>/**
               * 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.
               *
               * &lt;p&gt;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);
              }
  </code></pre>
  
  <p>So it seems that in the case of an Http message error the whole download stream is canceled.</p>