感觉有点蛋疼。。
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();
好蛋疼
有没有什么好办法可以解决?
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();
好蛋疼
有没有什么好办法可以解决?
所以理论上你可以不关闭它,但缺点是无法预知文件对象被从List中Remove掉之后JVM什么时候开始回收,在此期间文件资源仍然被占用。所以最终这个问题取决于你的实际需求了。
如果你确定文件被多占用一会没有关系,你可以省掉在代码中加上close()的麻烦。
否则你还是必须象你说的,在remove它之前关闭它。
归根到底这个问题也是你自己造成的,一般来说,应当尽量减少占用文件的的时间,集中时间读写完数据就关闭它,尽量避免这种将它存放到一个list中待用的情况发生。或者你也可以在list中仅保存文件名,有需要时再打开文件读写然后关闭。
如果这种情况非常多的话你也可以自己写一个FileList类,重写remove()方法就行了
的时候再打开吧,采用“经典”的流程:
try {
打开文件
} catch (IOException e) {
// 异常处理
} finally {
if (xxx != null) {
try {
xxx.close();
} catch (IOException e) {
// 异常处理
}
}
}
不然楼主还是调用closeFile()吧