java如何确保关闭文件

java如何确保关闭文件,java,file,Java,File,我有一个类,它在构造函数中打开一个文件,在调用方法时写入文件。我应该在哪里关闭文件? 该类实现了一个只有一个方法的通用接口,我不会添加公共方法 public interface I { void makeChange(); } public class C implements I { FileWriter f; PrintWriter p; public C() { f = new FileWriter("log.txt");

我有一个类,它在构造函数中打开一个文件,在调用方法时写入文件。我应该在哪里关闭文件? 该类实现了一个只有一个方法的通用接口,我不会添加公共方法

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(); 
 }

阻止您添加公共方法
endChanges()
的设计本质上是错误的,并且阻止您以正确的方式执行此操作

如果这是某种家庭作业或测验(更糟糕的是,测验家庭作业),“正确”答案可能是使用
finalize()
。但是正如您自己所注意到的,这个方法甚至可能不会运行(例如,如果JVM在需要释放对象之前停止)。在这种简单的情况下,这是可以的,因为它将同时关闭文件,但通常不鼓励使用
finalize()
,原因正是您遇到的


正确的方法是让类实现
Closeable
接口,并提供一个
close()
方法供用户在完成时调用。因为要在打开和关闭文件之间调用多个调用,所以这是标准方法

(编辑为添加):如果您有多个实现,其中一些实现需要任何清理逻辑,而另一些则不需要,则界面可以有一个用户必须调用的清理(关闭)方法,但有些实现保留为空



如果您需要绝对确保用户没有忘记关闭文件,可以安装一个
doWithFile()
方法,该方法接受对文件执行的回调,打开文件,执行回调,然后关闭文件。

为什么不能添加
endChanges()
为什么不能在makeChange()中添加p&f.close()?是否打算多次调用makeChange()?如果否,则用try和finally括起来,在finally中您可以关闭。@MarkYisri因为接口I的其他实现不使用文件,目标是为所有实现运行相同的代码。在构造函数中打开资源通常是个坏主意。首先,如果对象构造中的其他内容失败,那么您就没有办法清理。