JAVA中流没关闭造成文件删除失败

BUG讲述

file.delete()返回true,但是文件没被删除。
JAVA代码逻辑如下:

//JAVA代码如下
if(file.exist()){   //1
        if(file.delete()){//2
        文件删除成功;
    }
}

//3 navive本地方法读取这个文件路径,创建新文件,进行一系列操作写入文件.

//本地方法打开文件如下
FILE *f;
fopen_s(f,path,"rw");
//f指针为空,说明未成功.

单步调试

按照如上代码进行单步调试,假设文件存在。
(1)代码运行至第一步,返回true。说明文件确实存在,去Windows文件系统查看,文件确实存在。
(2)代码运行至第二步,返回true。按照返回值来说,文件确实是删除成功了的。但是去Windows文件系统查看,文件还没有被删除(单步调试状态)。
该文件无法被delete删除,显示需要管理员权限,但是又获取不到权限删除(已经是管理员权限),但是该文件可以被shift+delete直接删除
同时,在IDE中运行条件表达式file.exist(),显示false
(3)由于第二步文件没有删除,代码运行至本地代码fopen_s处,导致文件指针为
(4)由于本地报错,导致程序停止,停止后该文件被删除。
初步分析:是文件被占用,但是删除操作也被记录,不被占用立马删除。或者是通知了文件系统,不被占用后,立马删除。

解决

向后移动删除代码,只是偶现不能删除的BUG()。

终极解决方案

查阅资料,有巨犇说可能是文件流没关闭,导致的文件删除返回true但文件没删除。翻看之前的代码,果然有一处该文件的FileInputStream没有关闭(不是我写的啊-.-)。加入流关闭方法,解决

原因分析:第一种方法可以解决部分,可能是因为GC的原因,把流对象回收掉了。
问题:流没关闭,为什么删除也能返回成功,但是没删掉呢? 等有时间探查一下delete的源码(本地方法),再回头记录。
如果有大神知道,还请评论区告诉我。

你可能感兴趣的:(java)