2013-07-05 5 views
1
내가 PDF의이 sdcard에 드리고자합니다

의 'N'번호를 작성하고 아래의 코드를 사용하는 동안 :에서 OutOfMemory 오류 파일

byte[] data = new byte[20000]; 
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
int nRead; 
InputStream fileInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); 

while ((nRead = fileInputStream.read(data, 0, data.length)) != -1) { 
    buffer.write(data, 0, nRead); 
} 

buffer.flush(); 
byte[] bytesToWrite = buffer.toByteArray(); 
fileInputStream.read(bytesToWrite); 
fileInputStream.close(); 

FileOutputStream fileOutputStream = null; 
String outputFileName = outputDirName + "/" + fileName; 
fileOutputStream = new FileOutputStream(outputFileName); 
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream); 
bos.write(bytesToWrite); 
bos.flush(); 
bos.close(); 

그것은 내가 한 번에 20 PDF 파일을 작성하려고하고있는 경우 잘 작동을, 하지만 그것보다 더 많은 경우 OutOfMemory 오류가 발생합니다.

무엇이 문제일까요?

답변

6

ByteArrayOutputStream을 사용하여 전체 파일을 RAM에 저장 한 다음 RAM에서 디스크로 복사합니다. 이것은 OutOfMemoryError의 원인 일 수 있습니다.

청크를 RAM으로 읽은 다음 디스크에 즉시 반복적으로 플러시하는 것이 훨씬 더 효율적입니다. 이렇게하기 위해 코드를 다시 작성했습니다.

byte[] data = new byte[20000]; 
    FileOutputStream fileOutputStream = null; 
    String outputFileName = outputDirName + "/" + fileName; 
    fileOutputStream = new FileOutputStream(outputFileName); 

    int nRead; 
    InputStream fileInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); 
    while ((nRead = fileInputStream.read(data, 0, data.length)) != -1) { 
     fileOutputStream.write(data,0,nRead); 
    } 
    fileInputStream.close(); 
    fileOutputStream.flush(); 
    fileOutputStream.close(); 
+0

괜찮아요. 바로 확인해 드리겠습니다. 잠시만 기다려주십시오. – Goofy

+0

그랬습니까? –

+0

예 잘 작동, 그 모든 파일을 작성 – Goofy