file.delete有时会失败,解决

解决file.delete失败问题

最近在项目中遇到是要FIle的delete方法后,文件一直删除不了,经排查,是当时刚好有文件处于读取状态(可能是文件夹里面直接读取或是java程序后台读取使用InputStreamReader或BufferedOutputStream这种流没有关闭)

解决:在调用这个delete之前使用system.gc()使用java垃圾回收,通知虚拟机希望进行一次垃圾回收,注意:这里并不一定会马上执行垃圾回收,至于什么时候进行回收还是取决于虚拟机,而且也不能保证一定进行回收

这里我是要删除这个文件夹下所有文件,所以使用for循环,由于不确定什么时候虚拟机会进行垃圾回收,所以循环了10次去遍历执行

for (String file : filels) {
	File fl = new File(file);
	final boolean result = false;
	int tryCount = 0;
	while (!result && tryCount++ < 10) {
			System.gc();
			fl.delete();
	}
}

批量删除某个文件夹下的所有文件

后面觉得效率很低,如果我有1000个文件删除这个去循环太慢了,后面找到一种直接使用window或linux底层命令去执行删除,这个效率会快很多,Runtime和Process都是jdk自带的包(我用的是1.8版本),不用额外引入(url是你传入的需要删除的文件地址)

logger.info("开始删除文件,地址:"+url);
Runtime runtime = Runtime.getRuntime();
// linux版本:String[] args = new String[] {"sh", "-c", "rm -f -r /usr/dir"};
// window版本String[] arg = new String[] {"cmd.exe", "/c", "rd D:\\a\\20210101 /q /s"};
String[] arg = new String[] { "cmd.exe", "/c", "rd " + url + " /q /s" };
try {
	Process proc = runtime.exec(arg);
} catch (IOException e) {
	e.printStackTrace();
}

大家可以试试,有问题评论区见!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐