今天发现在执行程序拷贝后会将所有的文件都删掉,当时我检查程序感觉问题很奇怪,开始怀疑是SWT(因为用这个来做界面是首次尝试)在退出销毁资源时将所有拷贝的文件作为资源一起销毁了。
晚上回来后继续做了跟踪,最终发现问题出在拷贝文件时先检查文件是否存在,如果存在就将文件删掉的逻辑,其实这个逻辑本身也没有什么问题,问题出在调用了
File.deleteOnExist()
在仔细阅读API文档后发现
Requests that the file or directory denoted by this abstract pathname be deleted when the virtual machine terminates. Deletion will be attempted only for normal termination of the virtual machine, as defined by the Java Language Specification.
Once deletion has been requested, it is not possible to cancel the request. This method should therefore be used with care.
Note: this method should not be used for file-locking, as the resulting protocol cannot be made to work reliably. The FileLock facility should be used instead.
也就是说这个方法会在JVM销毁时做文件删除操作,并且特别说明这个方法不要用在文件锁的情况下。
此时恍然大悟不是在SWT(此时又一次验证了SWT是没有问题的)销毁时删除了资源而是在JVM销毁是这个方法在做怪。
最后为了不影响逻辑将这个方法的调用改为
File.delete()
这又一次让我领悟了对基础API的熟练掌握对一个程序员的重要性。
借此与大家共勉,希望大家不要象我一样哦:)
明天要做单元测试的研讨,这又让我想起来,如果对应的方法有好的单元测试,那这个问题肯定是可以发现的,但由于没有做单元测试的时间,所以当初这一点也就被忽略了。
File.deleteOnExist
![](https://img-home.csdnimg.cn/images/20240711042549.png)