因文件对象未释放导致文件无法删除问题处理

       最近,我在用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对文件操作引起的。(网上有人这么说,是否正确还需要进一步验证)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值