java如何确保关闭文件
我有一个类,它在构造函数中打开一个文件,在调用方法时写入文件。我应该在哪里关闭文件? 该类实现了一个只有一个方法的通用接口,我不会添加公共方法
public interface I {
void makeChange();
}
public class C implements I {
FileWriter f;
PrintWriter p;
public C() {
f = new FileWriter("log.txt");
p = new PrintWriter(p);
}
@Override
public void makeChange() {
p.println("something");
p.flush();
}
}
我不允许添加公共方法endChanges()
此外,该类无法知道更改何时结束
我可以更改构造函数和makeChange()的工作方式
我尝试了finalize(),但它甚至没有运行
编辑。 接口I由许多类实现。 其中一些不需要文件,因此不需要closeFile()方法
目标是使所有实现都运行相同的代码:
public static void main(String args[]) {
I c1 = new C();
c1.makeChange();
I c2 = new D(); // D is an implementation of I that doesn't handle a file
c2.makeChange();
}
# 1 楼答案
阻止您添加公共方法
endChanges()
的设计本质上是错误的,并且阻止您以正确的方式执行此操作如果这是某种家庭作业或测验(或者更糟糕的是,测验家庭作业),“正确”答案可能是使用
finalize()
。但是正如您自己所注意到的,这个方法甚至可能不会运行(例如,如果JVM在需要释放对象之前停止)。在这种简单的情况下,这是可以的,因为它将同时关闭文件,但通常不鼓励使用finalize()
,原因正是您遇到的正确的方法是让类实现
Closeable
接口,并提供一个close()
方法供用户在完成时调用。因为要在打开和关闭文件之间调用多个调用,所以这是标准方法(编辑为添加):如果您有多个实现,其中一些实现需要任何清理逻辑,而另一些则不需要,则界面可以有一个用户必须调用的清理(关闭)方法,但有些实现保留为空
如果您需要绝对确保用户没有忘记关闭文件,可以安装一个
doWithFile()
方法,该方法接受对文件执行的回调,打开文件,执行回调,然后关闭文件