何时刷新BufferedWriter

时间:2009-05-25 21:53:00

标签: java io

在Java程序(Java 1.5)中,我有一个包装文件编写器的BufferedWriter,我多次调用write()...生成的文件非常大......

在这个文件的行中,有些是不完整的......

每次写东西时我是否需要调用flush(但我怀疑它效率低下)或使用BufferedWriter的其他方法或使用其他类...?

(因为我写了很多行,我确实希望有一些非常有效的东西。) 什么是理想的“潮红”时刻? (当我达到BufferedWriter的容量时)......

初始化:

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打印出的信息不会出现在结果文件中......

3 个答案:

答案 0 :(得分:84)

BufferedWriter填充缓冲区时已经刷新。来自BufferedWriter.write的文档:

  

通常,此方法将给定数组中的字符存储到此流的缓冲区中,   根据需要将缓冲区刷新到基础流

(强调我的。)

BufferedWriter的要点基本上是将大量的小写写合并到更少的大写中,因为这通常更有效(但更难以编写代码)。你应该不需要做任何特殊的事情来让它正常工作,除了确保你在完成时用它冲洗它 - 并且调用close()将执行此操作并且无论如何,刷新/关闭底层作家。

换句话说,放松 - 只需写,写,写和关闭:)你通常需要手动调用flush的唯一一次是,如果你真的,真的需要数据现在在磁盘上。 (例如,如果你有一个永久记录器,你可能想要经常刷新它,这样无论谁在阅读日志之前都不需要等到缓冲区已满,才能看到新的日志条目!)

答案 1 :(得分:11)

理想的刷新时刻是在文件关闭之前需要另一个程序读取文件以查看已写入的数据。在许多情况下,这绝不是。

答案 2 :(得分:0)

如果您有一个循环initprintAfterInfo交替出现,我对您的问题的猜测是,在同一文件上创建新作者之前,您没有close您的作家。您最好一次创建BufferedWriter,然后在所有处理结束时将其关闭。