2012-02-24 3 views
5

Я пытаюсь читать и писать большие файлы (размером более 100 МБ), используя BufferedInputStream & BufferedOutputStream. Я получаю проблему с памятью кучи & исключение OOM.
код выглядит следующим образом:Написание больших файлов с использованием BufferedOutputStream

BufferedInputStream buffIn = new BufferedInputStream(iStream); 
/** iStream is the InputStream object **/ 

BufferedOutputStream buffOut=new BufferedOutputStream(new FileOutputStream(file)); 
byte []arr = new byte [1024 * 1024]; 
int available = -1; 
while((available = buffIn.read(arr)) > 0) { 
    buffOut.write(arr, 0, available); 
}  
buffOut.flush(); 
buffOut.close();   

Мой вопрос, когда мы используем BufferedOutputStreeam он держит в памяти до полного файла записывается?
Каков наилучший способ записи больших файлов с помощью BufferedOutputStream?

+0

попробуйте промыть внутри петли –

+0

это буферизация, пока вы не промойте ее. закройте его в цикле while. –

+2

@jcomeau_ictx - no, BufferedOutputStream не буферизует, пока вы не очистите его, он имеет фиксированный размер внутреннего буфера. – jtahlborn

ответ

5

ничего не случилось с кодом, который вы предоставили. ваши проблемы с памятью должны лежать в другом месте. буферизованные потоки имеют фиксированный предел использования памяти.

Самый простой способ определить, что вызвало OOME, конечно, состоит в том, чтобы OOME сгенерировал кучу кучи, а затем изучил этот кучи кучи в профилировщике памяти.

+0

Это правильно. Но есть проблема с кодом, buffOut.write() может писать меньше байтов, чем то, о чем вы просите его писать, и в этом случае вам нужно будет продолжать писать, пока не напишите все доступные байты. – Bill

+1

@Bill - нет, это не так. 'write()' всегда записывает все байты (у него нет возвращаемого значения). – jtahlborn

+0

Вы используете этот код во многих потоках одновременно? Это довольно сложно понять, что это источник ошибки вашей памяти. –