【问题标题】:When should I close() a BufferedWriter?我什么时候应该关闭()一个 BufferedWriter?
【发布时间】:2011-07-27 07:23:18
【问题描述】:

每次按下按钮时,我都会在文本文件中添加一行。目前我每次按下按钮时都这样做:

...
try {
        BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
        if (fileIsNew == true)
            bw.write(firstLine);
        bw.write(string);
        bw.close();
        Log.v("file", "written to file:" + f.getAbsolutePath());
    } catch (IOException e) {
        Log.v("IOException", e.toString());
    }
...

我认为在每行之后关闭缓冲写入器并不是一个好主意,因为缓冲写入器的目的是缓冲输出,对吗?

那么我应该什么时候打电话给bw.close()? 我应该在某种init() 中创建新的 BufferedWriter 吗? 我认为每次按下按钮时都创建一个新的 BufferedWriter 效率很低。

【问题讨论】:

    标签: java android bufferedwriter


    【解决方案1】:

    您可以将其声明为成员字段,在第一次按下按钮时创建它,通过设置一个标志,并保持打开状态。

    每按一次,请致电write(),然后致电flush()(以避免内容丢失)。

    BufferedWriter bw;
    boolean isOpen = false;
    // ..
    try {
        if (!isOpen) {
            bw = new BufferedWriter(new FileWriter(logFile, true));
            bw.write(firstLine);
            isOpen = true;
        }
        bw.write(string);
        bw.flush();
        Log.v("file", "written to file:" + logFile.getAbsolutePath());
    } catch (IOException e) {
        Log.v("IOException", e.toString());
    }
    

    【讨论】:

      【解决方案2】:

      this article 中,您可以发现它具有良好的编程风格:

      简短的回答是,您应该创建一个 FileWriter 实例,并将附加标志设置为 true,如下所示:

      BufferedWriter bw = new BufferedWriter(new FileWriter("checkbook.dat", true));
      

      玩得开心

      【讨论】:

      • 谢谢你,非常有用的资源。 :)
      • 我已经编辑了您的答案,因此它引用了参考文章的主要思想。仅链接的答案不太有用,因为链接可能会损坏。
      【解决方案3】:

      如果您不打算再次使用缓冲阅读器,则应始终关闭它,这里就是这种情况。否则,由 GC 决定何时收集该对象,届时资源将被释放。

      所以简短的回答是:总是!

      【讨论】:

        【解决方案4】:

        你基本上自己回答了这个问题,它的全部目的是 IO 缓冲。通常你会打开它一次,可能是在 init 中,或者在第一次需要它的时候,当你写完所有数据后,你会刷新并关闭它。但是请注意,除非您明确调用 flush(),否则内容可能不会在您调用 write() 的确切时刻写入,而是缓冲以供以后输出。

        【讨论】:

        • 问题是,我怎么知道用户何时完成了所有数据的写入?我不想实现“完成”按钮,数据应该就在那里。例如,我可以每 10 行左右调用一次吗?
        • 嗯,这真的取决于你在写什么......如果它是某种文本编辑的东西,我可能会在用户退出应用程序时刷新并关闭它......
        • @Override public void onPause() { output.closeBufferedWriter(); } 可以吗?
        • 不知道,我对机器人不是特别熟悉,如果用户在 onPause 触发后一段时间内不输入任何数据,当然......
        猜你喜欢
        • 1970-01-01
        • 2023-02-07
        • 2011-03-21
        • 2012-12-23
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        相关资源
        最近更新 更多