Warm tip: This article is reproduced from serverfault.com, please click

java-何时刷新BufferedWriter

(java - When to flush a BufferedWriter)

发布于 2009-05-25 21:52:59

在Java程序(Java 1.5)中,我有一个BufferedWriter,它包装了Filewriter,并且多次调用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打印出的信息不会出现在结果文件中。

Questioner
LB40
Viewed
0
Jon Skeet 2009-05-26 06:03:37

BufferedWriter当它填充它的缓存就会刷新已。来自的文档BufferedWriter.write

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

(强调我的。)

BufferedWriter基本上,目的是将大量的小写合并为更少的大写,因为通常这样做效率更高(但更难于编写代码)。不过,除了确保在完成处理后将刷新之外,你无需执行任何特殊操作即可使其正常工作,并且调用close()将这样做并无论如何都刷新/关闭底层编写器。

换句话说,放轻松-只需写,写,写和关闭:)通常,flush你真正需要手动调用的唯一时间是真正需要将数据现在存储在磁盘上。(例如,如果你有一个永久记录器,则可能要经常刷新它,以使正在阅读日志的人不必等到缓冲区已满就可以看到新的日志条目!)