2012-01-04 91 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循環內寫入文件,而不是將其附加到緩衝區。