每次按下按钮时,我都会在文本文件中附加一行。目前我每次按下按钮时都会这样做:
...
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());
}
...
我不认为在每行之后关闭缓冲区是一个好主意,因为bufferedWriter的目的是缓冲输出,对吗?
那我何时应该致电bw.close()
?
我应该在某种init()
中创建新的BufferedWriter吗?
我认为每次按下按钮时创建一个新的BufferedWriter都是低效的。
答案 0 :(得分:6)
您可以将其声明为成员字段,首先按下按钮,通过设置标记创建它,然后将其保持打开状态。
每按一次,请拨打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());
}
答案 1 :(得分:1)
在this article中,您可以找到一种良好的编程风格:
简短的回答是你应该创建一个
FileWriter
实例,并将append标志设置为true,如下所示:BufferedWriter bw = new BufferedWriter(new FileWriter("checkbook.dat", true));
玩得开心
答案 2 :(得分:0)
如果你不打算再次使用它,你应该总是关闭缓冲的阅读器,这就是这里的情况。否则,您将离开GC以决定何时收集对象,并且资源将在那时处理。
所以简短的回答是:总是!
答案 3 :(得分:0)
你基本上自己回答了这个问题,它的全部目的是 IO缓冲。通常你打开它一次,可以在初始化或者第一次需要的时候,你在写完所有数据时刷新并关闭它。但请注意,除非您明确调用flush()
,否则内容可能不是在您向其write()
调用的时刻写入的,而是在以后输出时进行缓冲。