java如何确保文件被关闭

时间:2016-11-24 12:59:04

标签: java file

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

library(data.table)
rbindlist(mget(paste0("data", 1:7))

我不允许添加公共方法endChanges()。

此类也无法知道更改何时结束。

我被允许改变构造函数和makeChange()的工作方式。

我尝试了finalize(),但它甚至没有运行。

EDIT。 接口I由许多类实现。 其中一些不需要文件,因此它们不需要closeFile()方法。

目标是为所有实现运行相同的代码:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

(编辑添加):如果你有多个实现,其中一些需要任何清理逻辑,而另一些则不需要,那么接口完全可以使用用户必须调用的清理(关闭)方法但是实现留空。

如果您需要绝对确定用户不会忘记关闭文件,您可以创建一个doWithFile()方法,该方法接受对文件执行的回调,打开文件,执行回调然后关闭文件。