2012-01-04 42 views
1
HttpResponse responseGet; 
     try { 
      responseGet = client.execute(get); 
      switch (responseGet.getStatusLine().getStatusCode()) { 
      case 200: 
       File SDCardRoot = Environment.getExternalStorageDirectory(); 
       File directory = new File(SDCardRoot 
         + "/OfflineDocuments/" 
         + (document.getPath() == null ? "" 
           : (document.getPath() + "/"))); 
       directory.mkdirs(); 
       File file = new File(directory, fileName); 
       InputStream is = responseGet.getEntity().getContent(); 
       BufferedInputStream bis = new BufferedInputStream(is); 

       ByteArrayBuffer baf = new ByteArrayBuffer(50); 
       int current = 0; 
       while ((current = bis.read()) != -1) { 
        baf.append((byte) current); 
       } 

       FileOutputStream fos = new FileOutputStream(file); 
       fos.write(baf.toByteArray()); 
       fos.close(); 
       break; 

      default: 
       Log.e("Statuscode", "Unexpected status code: " 
         + responseGet.getStatusLine().getStatusCode()); 
       break; 
      } 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 

这适用于小文档。但对于大于几MB的文档,此代码会因“OutOfMemoryException”而崩溃。任何想法?下载文件时内存不足

回答

1

您正在将文件浑浊到内存中,然后将该缓冲文件写入存储。相反,跳过缓存和写块存储,因为他们进来。

FileOutputStream fos = new FileOutputStream(file); 
while ((current = bis.read()) != -1) { 
    fos.write(current); 
} 
fos.close(); 

笔记......不是Android开发人员,所以不知道这是否会实际工作,所以把它当作伪代码。

+0

由于每个单字节都被写入,您的解决方案会非常困难地减慢应用程序速度。我改变了这种方式,我总结了1MB,立即写入,并再次缓存1MB。完美的作品。 – 2012-01-04 17:21:45

0

您只是试图将整个文件读入内存,而您的JVM没有足够的可用内存。您可能想要在while循环内写入文件,而不是将其附加到缓冲区。