2012-01-04 5 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(); 

음 ...하지 안드로이드 개발자, 그래서 아무 생각이 실제로 것 일 경우, 그래서 의사 코드로이 문제를 처리합니다.

+0

귀하의 솔루션은 모든 단일 바이트가 기록되기 때문에 앱을 매우 어렵게 만듭니다. 나는 그것을 1MB를 요약하고, 한 번에 작성하고, 1MB를 다시 캐싱하기 시작했다. 완벽하게 작동합니다. –

0

전체 파일을 메모리로 읽어 들이기 만하면 JVM의 메모리가 충분하지 않습니다. 당신은 아마도 버퍼에 추가하는 것이 아니라 while 루프 내부의 파일에 쓰기를 원할 것입니다.

관련 문제