Буферизованный писатель Java

File file = new File("result.csv");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);

Что произойдет, если мы не закроем буферизованный объект записи после завершения записи? Я имею в виду, что если мы пропустим bw.close()?


person jibs    schedule 03.03.2014    source источник


Ответы (1)


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

Кроме того, хотя ваш BufferedWriter не был удален сборщиком мусора, файл, в который он записывался, останется открытым для вашей операционной системы. Если это Windows, вы не сможете удалить файл до тех пор, пока дескриптор файла не будет закрыт, либо из-за того, что BufferedWriter, наконец, будет собран мусор, либо из-за выхода JVM.

  • BufferedWriter.close() сбрасывает буфер в базовый поток, поэтому, если вы забудете flush() и не закроете, в вашем файле может не быть всего текста, который вы в него написали.

  • BufferedWriter.close() также закрывает обернутый Writer. Когда это FileWriter, это в конечном итоге закроет FileOutputStream и сообщит ОС, что вы закончили запись в файл.

  • Сборщик мусора автоматически вызовет close() не на BufferedWriter или обернутом FileWriter, а на FileOuputStream. Так что ОС будет довольна, а вот GC придется ждать.

  • Однако вы всегда хотите освобождать ресурсы ОС, как только они вам больше не нужны. Это касается открытых файлов, соединений с базами данных, очередей печати... всего. Поверь мне в этом.

  • BufferedWriter.close() очищает внутренний буфер символов, так что память будет доступна для сборки мусора, даже если сам BufferedWriter остается в области видимости.

Проверьте здесь для получения более подробной информации.

person Abimaran Kugathasan    schedule 03.03.2014