何时刷新缓冲写入器

2022-08-31 20:09:05

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

在此文件的行中,其中一些是不完整的...

我是否需要在每次编写内容时调用 flush(但我怀疑这会是低效的),或者使用 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 打印出来的信息不会出现在结果文件中...


答案 1

将已刷新,当它填充其缓冲区时。来自BufferedWriter.write的文档:BufferedWriter

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

(强调我的。

重点基本上是将许多小的写入合并到更少的大写入中,因为这通常更有效(但编码更痛苦)。你不需要做任何特别的事情来让它正常工作,除了确保你在完成它时冲洗它 - 调用会这样做,并冲洗/关闭底层的编写器。BufferedWriterclose()

换句话说,放松 - 只需写,写,写和关闭:)您通常唯一需要手动调用的时间是,如果您真的非常非常需要现在的数据在磁盘上。(例如,如果您有一个永久记录器,您可能希望每隔一段时间刷新它,以便读取日志的人不需要等到缓冲区已满后才能看到新的日志条目!flush


答案 2

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


推荐