感觉有点蛋疼。。
C++的话,可以在析构函数里,关闭文件。
比如有个类 class A{
public A() throws FileNotFoundException{
f = new RandomAccessFile("001.txt", "r");
}
RandomAccessFile f;
}这个文件f,到底在什么地方关闭合适?
假如 A 被放进一个容器中, List<A> list = new LinkedList();
A a = new A();
list.add(a);
list.remove(0);
本来我们期望类A可以在从list中移走时,自动关闭文件
现在不得不为A加上一个 closeFile() 函数,再在remove后调用。 class A{

public A() throws FileNotFoundException{
f = new RandomAccessFile("001.txt", "r"); }
public void closeFile() throws IOException{
f.close();
}
RandomAccessFile f;
}
List<A> list = new LinkedList();
A a = new A();
list.add(a);
A aa = list.remove(0);
aa.closeFile();
好蛋疼
有没有什么好办法可以解决?

解决方案 »

  1.   

    RandomAccessFile重写了Object的finalize()方法,该方法在文件对象被JVM回收时触发,触发时会自动调用close()方法。
    所以理论上你可以不关闭它,但缺点是无法预知文件对象被从List中Remove掉之后JVM什么时候开始回收,在此期间文件资源仍然被占用。所以最终这个问题取决于你的实际需求了。
    如果你确定文件被多占用一会没有关系,你可以省掉在代码中加上close()的麻烦。
    否则你还是必须象你说的,在remove它之前关闭它。
    归根到底这个问题也是你自己造成的,一般来说,应当尽量减少占用文件的的时间,集中时间读写完数据就关闭它,尽量避免这种将它存放到一个list中待用的情况发生。或者你也可以在list中仅保存文件名,有需要时再打开文件读写然后关闭。
      

  2.   

    似乎没有别的方法,不过即使加上一句aa.closeFile();也不是太麻烦.
    如果这种情况非常多的话你也可以自己写一个FileList类,重写remove()方法就行了
      

  3.   

    放入finally块中处理恐怕是最合适的方法了
      

  4.   

    蛋疼的问题,建议还是在需要读取文件内容
    的时候再打开吧,采用“经典”的流程:
    try {
        打开文件
    } catch (IOException e) {
        // 异常处理
    } finally {
        if (xxx != null) {
            try {
                xxx.close();
            } catch (IOException e) {
                // 异常处理
            }
        }
    }
    不然楼主还是调用closeFile()吧