Подтвердить что ты не робот

Когда нужно сбросить 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, не отображается в файле результатов...

4b9b3361

Ответ 1

BufferedWriter уже будет скрываться при заполнении буфера. Из документов BufferedWriter.write:

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

(Подчеркните мой.)

Точка BufferedWriter заключается в том, чтобы объединить множество небольших записей в гораздо меньшие большие записи, поскольку это обычно более эффективно (но больше - боль для кода). Вам не нужно делать что-либо особенное, чтобы заставить его работать правильно, хотя, кроме того, чтобы убедиться, что вы его очистите, когда закончите с ним, - и вызов close() сделает это и все равно закроет и закроет создателя.

Другими словами, расслабьтесь - просто пишите, пишите, пишите и закрывайте:) Единственный раз, когда вам обычно нужно вызывать flush вручную, - это действительно действительно нужно, чтобы данные были на диске сейчас. (Например, если у вас вечный регистратор, вы можете захотеть очистить его так часто, чтобы каждый, кто читает журналы, не должен ждать, пока буфер не заполнит, прежде чем они смогут видеть новые записи в журнале!)

Ответ 2

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