Java try代码块中调用file.delete()方法未生效的原因是什么?
问题成因
你使用的是Java 7+的try-with-resources语法,这类语法的执行顺序为:
- 先初始化小括号内声明的资源(本例中的
FileInputStream、FileOutputStream) - 执行大括号内的业务代码(复制逻辑+
delete调用) - 自动按逆序关闭所有声明的资源
你在try代码块内部调用fileLocation.delete()时,FileInputStream还处于打开状态,源文件被当前进程占用加锁,操作系统会禁止删除操作,因此delete执行失败。另外需要注意,File.delete()方法只会返回布尔值表示是否删除成功,不会抛出异常,因此你没有收到对应的错误提示。
解决方案
核心思路是等资源自动释放、源文件锁解除后,再执行删除操作,同时增加复制成功的标志位,避免复制异常时误删源文件,修改后的参考代码如下:
File fileLocation = new File("C:\\fileLocation\\picture.png"); File fileDestination = new File("C:\\fileDestination\\picture.png"); // 标记复制是否正常完成 boolean copySuccess = false; try(FileInputStream input = new FileInputStream(fileLocation); FileOutputStream output = new FileOutputStream(fileDestination)) { byte[] buffer = new byte[1024]; int length; while((length = input.read(buffer)) > 0) { output.write(buffer,0, length); } // 复制逻辑执行完成,标记为成功 copySuccess = true; } catch(IOException exc) { System.out.println(exc.getMessage()); } // 只有复制成功才执行删除,此时流已被自动关闭,文件无占用锁 if (copySuccess) { boolean deleteResult = fileLocation.delete(); if (!deleteResult) { System.out.println("源文件删除失败,请检查文件权限或是否被其他进程占用"); } }
可选优化方案
如果你使用的是Java 7及以上版本,可以直接使用JDK原生的Files.move()方法实现文件移动逻辑,无需自己编写复制、删除代码,可靠性更高,内置原子性保证:
import java.nio.file.Files; import java.nio.file.StandardCopyOption; // 一行代码完成移动,REPLACE_EXISTING表示目标路径存在时覆盖 Files.move(fileLocation.toPath(), fileDestination.toPath(), StandardCopyOption.REPLACE_EXISTING);
内容的提问来源于stack exchange,提问作者user10170761
相关产品推荐
相关产品推荐

