有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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


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

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


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