3

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

...
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()呢?我应该以某种方式创建新的 BufferedWriterinit()吗?我认为每次按下按钮时创建一个新的 BufferedWriter 效率很低。

4

4 回答 4

7

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

在每次按下时,调用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());
}
于 2011-07-27T07:26:58.007 回答
2

这篇文章中,你可以发现,在一个好的编程风格中:

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

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

玩得开心

于 2011-07-27T07:33:44.140 回答
0

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

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

于 2011-07-27T07:26:35.027 回答
0

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

于 2011-07-27T07:27:21.483 回答