1. 使用 Java JDK 6 删除文件
JDK 6 提供了最基础的 java.io.File
类来操作文件系统。删除文件的方式非常直接,调用 delete()
方法即可。
✅ 优点:无需额外依赖,原生支持
❌ 缺点:异常处理不明确,失败时只返回 false
,不抛异常
示例代码:
@Test
public void givenUsingJDK6_whenDeletingAFile_thenCorrect() throws IOException {
new File("src/test/resources/fileToDelete_jdk6.txt").createNewFile();
File fileToDelete = new File("src/test/resources/fileToDelete_jdk6.txt");
boolean success = fileToDelete.delete();
assertTrue(success);
}
⚠️ 踩坑提醒:如果文件不存在或没有权限,delete()
会静默失败,返回 false
,不会抛出异常。这意味着你必须手动判断返回值,否则容易忽略删除失败的情况。
所以在生产环境中,仅靠
delete()
返回值做判断是必须的,不能假设调用即成功。
2. 使用 Java JDK 7 NIO.2 删除文件
JDK 7 引入了 java.nio.file.Files
和 Path
,提供了更现代、更健壮的文件操作 API。
✅ 优点:异常语义清晰,失败时抛出具体异常,便于排查问题
✅ 支持更丰富的文件系统操作(如原子操作、符号链接等)
示例代码:
@Test
public void givenUsingJDK7nio2_whenDeletingAFile_thenCorrect() throws IOException {
Files.createFile(Paths.get("src/test/resources/fileToDelete_jdk7.txt"));
Path fileToDeletePath = Paths.get("src/test/resources/fileToDelete_jdk7.txt");
Files.delete(fileToDeletePath);
}
⚠️ 关键行为差异:
- 如果文件不存在,会抛出
NoSuchFileException
- 如果文件无法访问(如被占用、权限不足),会抛出相应的
IOException
这比 JDK 6 更“诚实”——失败就是失败,不会让你误以为删除成功。
📌 小技巧:如果你希望“存在就删,不存在也无所谓”,可以用
Files.deleteIfExists(path)
,它在文件不存在时返回false
而不抛异常。
3. 使用 Apache Commons IO 删除文件
Apache Commons IO 是 Java 社区广泛使用的工具库,封装了很多常见文件操作,代码更简洁,语义更清晰。
3.1 静默删除:deleteQuietly()
适用于“尽力而为”的场景,比如清理临时文件,失败也不影响主流程。
@Test
public void givenUsingCommonsIo_whenDeletingAFileV1_thenCorrect() throws IOException {
FileUtils.touch(new File("src/test/resources/fileToDelete_commonsIo.txt"));
File fileToDelete = FileUtils.getFile("src/test/resources/fileToDelete_commonsIo.txt");
boolean success = FileUtils.deleteQuietly(fileToDelete);
assertTrue(success);
}
✅ 特点:
- 捕获所有异常,不抛出
- 返回
boolean
表示是否删除成功 - 适合“后台清理”类任务
3.2 强制删除:forceDelete()
当你明确希望失败时抛异常,便于及时发现问题。
@Test
public void givenUsingCommonsIo_whenDeletingAFileV2_thenCorrect() throws IOException {
FileUtils.touch(new File("src/test/resources/fileToDelete.txt"));
FileUtils.forceDelete(FileUtils.getFile("src/test/resources/fileToDelete.txt"));
}
⚠️ 如果文件不存在,会抛出 FileNotFoundException
:
java.io.FileNotFoundException: File does not exist: srctestresourcesfileToDelete.txt
at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:2275)
✅ 适用场景:
- 配置文件删除必须成功
- 测试环境资源清理需确保状态一致
总结对比
方式 | 是否抛异常 | 是否需额外依赖 | 推荐使用场景 |
---|---|---|---|
JDK 6 File.delete() |
❌ 只返回 false |
✅ 无 | 简单逻辑,能手动判断返回值 |
JDK 7 Files.delete() |
✅ 抛具体异常 | ✅ 无 | 生产环境首选,异常清晰 |
Commons IO deleteQuietly() |
❌ 静默失败 | ⚠️ 需引入 commons-io | 临时文件清理,失败可容忍 |
Commons IO forceDelete() |
✅ 失败抛异常 | ⚠️ 需引入 commons-io | 必须成功的删除操作 |
✅ 推荐实践:
- 日常开发优先使用 JDK 7+ 的
Files.delete()
或deleteIfExists()
- 若项目已引入 Commons IO,可根据语义选择
deleteQuietly
或forceDelete
- 避免在关键路径上使用
File.delete()
而不判断返回值——这是典型的“看似没问题,上线就出事”的坑
💡 一句话总结:让异常说话,别让它沉默。