原因
- .看看是否被别的进程引用,手工删除试试(删除不了就是被别的进程占用)
- file是文件夹 并且不为空,有别的文件夹或文件
- 极有可能有可能自己前面没有关闭此文件的流(我遇到的情况)
解决办法
- 触发垃圾回收(不推荐)
/*
在执行删除语句前先执行,提醒或告诉虚拟机,希望进行一次垃圾回收,至于什么时候进行回收还是取决于虚拟机,而且也不能保证一定进行回收(如果-XX:+DisableExplicitGC设置成true,则不会进行回收)。
*/
System.gc();
- 关闭流
/*
在使用到当前文件或获取当前文件的方法中检查是否开启流和关闭流,若开启则必须关闭流,文件才能被正常删除。
*/
// 方法1:手动关闭
fileInputStream.close();
/**
*方法2:使用Lombok中注解@Cleanup,在创建流的时候使用
*其结果就是在该作用域的末尾将调用in.close()方法,并使用了try/finally代码块确认该方法一定执行。
*/
// 例如:
@Cleanup InputStream in = new FileInputStream("some/file");
/*
如果想要标记一个没有close()方法的对象,但是有另一个没有参数的清除方法,可以像下面的代码中那样指定具体的清除方法名:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
默认情况下清除方法被认定为close()。包含一个或者多个参数的清除方法不能使用@Cleanup来进行调用。
*/
- 结束引用到该文件的其他进程
备注
删除文件前进行判断
//根据路径创建文件对象
File file = new File(path);
//路径是个文件且不为空时删除文件
if(file.isFile()&&file.exists()){
flag = file.delete();
}