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.FilesPath,提供了更现代、更健壮的文件操作 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,可根据语义选择 deleteQuietlyforceDelete
  • 避免在关键路径上使用 File.delete() 而不判断返回值——这是典型的“看似没问题,上线就出事”的坑

💡 一句话总结:让异常说话,别让它沉默


原始标题:Java - Delete a File