最近,我在用J2EE编写一套文件管理系统,通过Web页面操作远程服务器上的文件。该系统实现在服务器上执行建立文件夹,上传文件,删除文件,改变当前文件夹等一系列操作。目前系统基本开发完成,只是删除文件老是失败,通过JDK类java.io.File,执行delete()方法,返回false。到Windows系统资源管理器,针对该文件做删除操作,系统提示“文件正在被另一个人或程序使用”。

       首先我断定,系统中还有未释放的java.io.File对象。我先搜索了程序中所有使用java.io.File的地方,对所有java.io.File对象变量,使用完后,将变量指向null(java.io.File没有close()方法)。再执行程序,问题依旧。

       后来,我又想到:虽然java.io.File对象变量都置为null了,但gc并没有马上把java.io.File对象释放掉,程序根本无法预测gc什么时候启动。通常,gc是在内存使用达到一定限度,或到一定时间才启动的。于是,我决定在文件删除前启动gc,加入语句:System.gc()。再执行程序,问题解决。

       不过,还是觉得不够完善,万不得已是不需要调用System.gc()的。我又仔细检查了一下代码,发现有一个地方这么写:

(new FileInputStream(f)). fis.available();

       这个地方用来获取文件大小。生成了FileInputStream对象,没有被变量引用,但文件还是在加载到内存了。我把这个地方改了一下,定义FileInputStream对象变量,并且最后将其close(),并将原来增加的System.gc()语句删除。再运行程序,一切OK。

       总结:

       1.使用I/O流对文件操作,最后一定要将其close掉。

       2.java.io.File并不会持续的锁定一个文件,如果删除文件提示“文件正在被另一个人或程序使用”,并不是因为java.io.File对文件操作引起的。(网上有人这么说,是否正确还需要进一步验证)

======================================================================================

本人用的是FileWriter, 相应操作如下, 注意最后要fw.close(),否则文件不能正常打开,会显示“该文件正在被其他程序使用,不能访问。”

FileWriter fw = new FileWriter(f);
     	            fw.write(data); 
     	            fw.flush();
     	            fw.close();