首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时刷新BufferedWriter

何时刷新BufferedWriter
EN

Stack Overflow用户
提问于 2009-05-25 21:53:00
回答 3查看 77.4K关注 0票数 50

在Java程序(Java1.5)中,我有一个包装了文件写入器的BufferedWriter,并且我多次调用write() ...生成的文件非常大...

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

我是不是需要在每次写东西的时候都调用flush (但我怀疑效率会很低),或者使用BufferedWriter的另一个方法,或者使用另一个类……?

(因为我有无数行要写,所以我确实想写一些非常有效的东西。)什么是理想的“冲刷”时刻?(当我达到BufferedWriter的容量时)...

Init:

代码语言:javascript
复制
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();
}

写作:

代码语言:javascript
复制
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");


        }
      }
    }

我刚刚发现那些不完整的行就是“正在处理文件”之前的那些行……所以当我从一个要分析的文件切换到另一个文件时,就会发生这种情况。

结语:

代码语言:javascript
复制
dispatch(unit);

try {
  if (analysisOutput != null) {
    printFileInfo();
    analysisOutput.close();
  }
} 
catch (IOException ex) {
  ex.printStackTrace();
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-25 22:03:37

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

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

(重点是我的。)

BufferedWriter的要点基本上是将大量的小写操作合并到更少的大写操作中,因为这通常更有效(但编码起来更痛苦)。不过,你不需要做任何特殊的事情来让它正常工作,除了确保在你完成它的时候刷新它--调用close()将会这样做,并且无论如何都会刷新/关闭底层的编写器。

换句话说,放松--只需要写,写,写和关闭:)你通常唯一需要手动调用flush的时候就是你真的真的需要数据在磁盘上的时候。(例如,如果您有一个永久日志记录器,您可能希望经常刷新它,这样任何正在读取日志的人都不需要等到缓冲区满了才能看到新的日志条目!)

票数 100
EN

Stack Overflow用户

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

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

票数 14
EN

Stack Overflow用户

发布于 2018-10-11 22:12:31

如果您有一个交替使用initprintAfterInfo的循环,我猜测您的问题是,在同一文件上创建新的编写器之前,您不会close您的编写器。您最好创建一次BufferedWriter,并在所有处理结束时关闭它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/908168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档