Когда нужно сбросить BufferedWriter?
В java-программе (java 1.5) у меня есть BufferedWriter, который обертывает Filewriter, и я вызываю write() много раз... Результирующий файл довольно большой...
Среди строк этого файла некоторые из них неполны...
Нужно ли мне называть flush каждый раз, когда я что-то пишу (но я подозреваю, что это будет неэффективно) или использовать другой метод BufferedWriter или использовать другой класс...?
(Поскольку у меня есть миллион строк для написания, я хочу иметь что-то довольно эффективное)
Каким будет идеальный момент "промывки"? (когда я достигаю емкости BufferedWriter).
Init:
try {
analysisOutput = new BufferedWriter(new FileWriter(
"analysisResults", true));
analysisOutput.newLine();
analysisOutput.write("Processing File " + fileName + "\n");
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
Запись:
private void printAfterInfo(String toBeMoved,HashMap<String, Boolean> afterMap, Location location)
throws IOException {
if(afterMap != null) {
for (Map.Entry<String, Boolean> map : afterMap.entrySet()) {
if (toBeMoved == "Condition") {
if (1 <= DEBUG)
System.out.println("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1)
+ " After " + map.getKey() + " "
+ map.getValue() + "\n");
analysisOutput.write("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1)
+ " After " + map.getKey() + " " + map.getValue()
+ "\n");
} else {
if (1 <= DEBUG)
System.out.println("###" + toBeMoved + " " + location + " "
+ map.getKey() + " After "
+ map.getValue() + "\n");
if (conditionalDefs.size() > 0)
analysisOutput.write("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1) + " "
+ map.getKey() + " After " + map.getValue()
+ "\n");
else
analysisOutput.write("###" + toBeMoved + " " + location + " " + map.getKey() + " After " + map.getValue() + "\n");
}
}
}
Я только что понял, что строки, которые являются неполными, это те, что были перед "Обработка файла"... так происходит, когда я переключаюсь с одного файла, который я анализирую на другой...
закрытия:
dispatch(unit);
try {
if (analysisOutput != null) {
printFileInfo();
analysisOutput.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
Иногда информация, распечатанная printFileInfo, не отображается в файле результатов...
Ответы
Ответ 1
BufferedWriter
уже будет скрываться при заполнении буфера. Из документов BufferedWriter.write
:
Обычно этот метод хранит символы из данного массива в этот буфер потока, при необходимости очищая буфер до базового потока.
(Подчеркните мой.)
Точка BufferedWriter
заключается в том, чтобы объединить множество небольших записей в гораздо меньшие большие записи, поскольку это обычно более эффективно (но больше - боль для кода). Вам не нужно делать что-либо особенное, чтобы заставить его работать правильно, хотя, кроме того, чтобы убедиться, что вы его очистите, когда закончите с ним, - и вызов close()
сделает это и все равно закроет и закроет создателя.
Другими словами, расслабьтесь - просто пишите, пишите, пишите и закрывайте:) Единственный раз, когда вам обычно нужно вызывать flush
вручную, - это действительно действительно нужно, чтобы данные были на диске сейчас. (Например, если у вас вечный регистратор, вы можете захотеть очистить его так часто, чтобы каждый, кто читает журналы, не должен ждать, пока буфер не заполнит, прежде чем они смогут видеть новые записи в журнале!)
Ответ 2
Идеальный момент промывки - это когда вам нужна другая программа, считывающая файл, чтобы увидеть записанные данные, прежде чем файл будет закрыт. Во многих случаях это никогда.