JAVA如何删除文件或者文件夹

 更新时间:2025年01月22日 09:10:27   作者:对酒当歌丶人生几何  
文章介绍了Java中删除文件和空文件夹的四种基本方法,包括File类的delete()、deleteOnExit()方法,以及Files类的delete(Path path)和deleteIfExists(Path path)方法,文章还讲述了如何使用Files类的walkFileTree方法和FileVisitor接口来删除整个目录或目录中的部分文件

一、JAVA删除文件或者空文件夹的四种基本方法

JAVA提供了大量的类来操作IO流,采用装饰者模式对IO的操作进行层层增强。

File类在JAVA中不仅代表文件还代表目录的意思。File能够新建、删除、重命名文件和目录。

但是File类功能比较局限,在JAVA 7中新增了java.nio.file包,其中新增了Path、Paths、Files等类用于弥补不足。

File类的delete()

File类的delete方法用于删除文件或者目录,如果删除成功则会返回true,否则返回false。

它无法判断文件是因为不存在而返回的false,,还是删除文件失败而返回的false(文件正在被使用)。

File类的deleteOnExit()

File类的deleteOnExit()方法并不会返回任何信息,以至于我们无法判断文件状态(是否被删除),因此我们应该避免使用这个方法。

Files类的delete(Path path)

Files这个类是JAVA 7引入用于操作文件的工具类,Files.delete方法如果删除文件成功不会返回任何信息,

如果文件不存在则会抛出java.nio.file.NoSuchFileException异常,如果操作删除的是一个不为空的目录,则会抛出java.nio.file.DirectoryNotEmptyException异常。推荐使用

Files类的deleteIfExists(Path path)

Files.deleteIfExists方法如果文件删除成功则返回true,如果文件不存在则返回false。

如果删除的是一个不为空的目录则抛出java.nio.file.DirectoryNotEmptyException异常。推荐使用

总结:

  • 由上面的总结可以看出,传统IO方法删除文件或文件夹,在删除失败的时候,最多返回一个false。
  • 通过这个false无法发掘删除失败的具体原因,是因为文件本身不存在删除失败?还是文件正在被使用而删除失败?
  • NIO 的方法在这一点上,就做的比较好,删除成功或失败都有具体的返回值或者异常信息,这样有利于我们在删除文件或文件夹的时候更好的做程序的异常处理。

二、如何删除整个目录或者目录中的部分文件

在演示如何删除整个目录或者目录中部分文件时,让我们先谈论Files中的walkFileTree方法和FileVisitor接口。

使用FileVistor遍历文件和目录

在传统的JAVA IO操作中,要程序遍历指定目录下所有文件和子目录,一般采用递归进行遍历,这种方式不仅复杂而且灵活性低。

因此JAVA 7提供了Files工具类来帮助我们更好的便利文件和子目录。

Files类提供了 walkFileTree方法来遍历文件和子目录。

这两个方法都需要FileVistor参数,FileVisitor表示文件访问器,第一个参数Path表示开始遍历的文件路径,int参数 表示遍历的层数。

walkFileTree方法会自动遍历Path路径下的所有文件和子目录。

遍历文件和子目录都会触发FileVisitor中的对应方法。 

FileVisitor中定义了四个方法:

//访问子目录之前触发该方法
FileVisitResult postVisitDirectory(T var1, IOException var2) throws IOException;
//访问子目录后触发该方法
FileVisitResult preVisitDirectory(T var1, BasicFileAttributes var2) throws IOException;
//访问file文件时触发该方法
FileVisitResult visitFile(T var1, BasicFileAttributes var2) throws IOException;
//访问file文件失败时触发该方法
FileVisitResult visitFileFailed(T var1, IOException var2) throws IOException;

上面四个方法都会返回一个FileVisitResult对象,用于表示访问后的行为,FileVisitResult定义了四种行为:

public enum FileVisitResult {
    CONTINUE, 表示继续访问
    TERMINATE, 继续访问,但是不访问该文件或者该目录的兄弟文件或目录
    SKIP_SUBTREE,继续访问,但是不再访问该文件或者该目录的子目录
    SKIP_SIBLINGS; 终止访问

    private FileVisitResult() {
    }
}

在实际编程运用中,可以通过继承SimpleFileVisitor来实现自己的文件访问器,或者重写SimpleFileVisitor类中的方法来实现自己的需求。

Files.walkFileTree删除指定文件夹所有文件(代码演示)

所提供的工具类是删除指定文件或目录下所有子目录或者文件。

如果只删除部分文件,请重写visitFile方法规则。

代码如下:

/**
 * @Author: Greyfus
 * @Create: 2022-06-26 19:24
 * @Version:
 * @Description:
 */
package com.file.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class FileUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 删除指定文件夹下文件
     *
     * @param filePath
     */
    public static void deleteFolders(String filePath) {

        Path path = Paths.get(filePath);
        try {
            Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
                    Files.delete(file);
                    LOGGER.info("删除文件: {}", file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir,
                                                          IOException exc) throws IOException {
                    Files.delete(dir);
                    LOGGER.info("文件夹被删除: {}", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

Files提供了大量的文件操作方法,可以满足大多数文件操作场景,本文并没有列出如何删除指定文件下部分文件或者目录的操作,其实只需要重写visitFile方法按自己的规则编写就行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Dubbo RPC接口的参数校验过程

    Dubbo RPC接口的参数校验过程

    文章介绍了在服务A调用服务B时,如何通过添加validation="true"实现参数校验,包括在pom文件、配置文件或注解@Reference中设置,并说明服务B的接口DTO可嵌套校验,需使用@Valid和@Validated
    2025-10-10
  • java HashMap 的工作原理详解

    java HashMap 的工作原理详解

    本文主要介绍java HashMap 的资料,这里整理了相关资料,并详细说明了HashMap的用法,有需要的小伙伴可以参考下
    2016-09-09
  • Java实现简单的表达式计算器功能示例

    Java实现简单的表达式计算器功能示例

    这篇文章主要介绍了Java实现简单的表达式计算器功能,结合实例形式分析了Java针对输入表达式的符号分解与数值运算相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • Windows安装Maven并配置环境变量

    Windows安装Maven并配置环境变量

    Maven是一个基于Java的项目管理工具,可以管理项目的构建、测试和部署,本文就来介绍一下Windows安装Maven并配置环境变量,感兴趣的可以了解一下
    2024-11-11
  • 详解Maven多模块打包遇到的问题解决方法

    详解Maven多模块打包遇到的问题解决方法

    这篇文章主要介绍了详解Maven多模块打包遇到的问题解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Spring Boot中使用AOP统一处理Web请求日志

    详解Spring Boot中使用AOP统一处理Web请求日志

    本篇文章主要介绍了详解Spring Boot中使用AOP统一处理Web请求日志,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java并发编程中高频异常的原因,场景与解决方案全解析

    Java并发编程中高频异常的原因,场景与解决方案全解析

    在Java并发编程中,异常处理是保障程序稳定性的核心环节,本文将深度解析4类高频并发异常的产生原因、典型场景,并给出可落地的解决方案,帮你彻底避开这些坑
    2026-03-03
  • 带你快速上手Servlet

    带你快速上手Servlet

    这篇文章主要介绍了带你快速上手Servlet,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • 使用Properties读取配置文件的示例详解

    使用Properties读取配置文件的示例详解

    开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,所以下文为大家准备了使用Properties读取配置文件的示例代码,希望对大家有所帮助
    2023-06-06
  • Mybatis空值关联的具体实现

    Mybatis空值关联的具体实现

    在复杂的数据库查询中,处理空值关联是一项常见的需求,本文就来介绍一下Mybatis空值关联的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07

最新评论