何时刷新BufferedWriter

LB4*_*B40 42 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();
}
Run Code Online (Sandbox Code Playgroud)

写作:

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");


        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

我刚刚发现不完整的行就是"处理文件"之前的行...所以当我从一个我分析的文件切换到另一个文件时就会发生...

收盘:

dispatch(unit);

try {
  if (analysisOutput != null) {
    printFileInfo();
    analysisOutput.close();
  }
} 
catch (IOException ex) {
  ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

有时printFileInfo打印出来的信息不会出现在结果文件中......

Jon*_*eet 86

BufferedWriter当它填充它的缓存就会刷新已.来自以下文件BufferedWriter.write:

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

(强调我的.)

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

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

  • 测试和批准。逐行写入 10Mb 的数字:每行写入后刷新 - 需要 7 秒,不刷新 - 4 秒。 (2认同)

Dav*_*ave 11

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