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方法按自己的规则编写就行。

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

相关文章

  • CountDownLatch和Atomic原子操作类源码解析

    CountDownLatch和Atomic原子操作类源码解析

    这篇文章主要为大家介绍了CountDownLatch和Atomic原子操作类的源码解析以及理解应用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 详解java中Reference的实现与相应的执行过程

    详解java中Reference的实现与相应的执行过程

    不知道大家知不知道特殊的reference对象都是被jvm专门处理的,所以这篇文章就相应的工作流程和referencequeue之间的协作进行梳理.有需要的朋友们可以参考借鉴。
    2016-09-09
  • Java项目实现寻找迷宫出路

    Java项目实现寻找迷宫出路

    这篇文章主要为大家详细介绍了Java项目实现寻找迷宫出路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java线程池参数举例详解(附详细代码)

    java线程池参数举例详解(附详细代码)

    这篇文章主要介绍了Java线程池的工作原理、构造方法和关键参数,它还提供了线程池的工作流程、常用线程池实现及参数优化建议,帮助开发者更好地管理和优化线程池,需要的朋友可以参考下
    2025-02-02
  • MyBatis-Plus 与Druid 数据源操作

    MyBatis-Plus 与Druid 数据源操作

    SpringBoot框架集成MyBatis-Plus和Druid数据源,简化了数据操作与监控,MyBatis-Plus作为MyBatis的增强工具,自动实现CRUD操作,减少手写SQL,提供分页、逻辑删除等功能,本文介绍MyBatis-Plus & Druid 数据源总结,感兴趣的朋友一起看看吧
    2024-09-09
  • 详解Java中字符串缓冲区StringBuffer类的使用

    详解Java中字符串缓冲区StringBuffer类的使用

    StringBuffer与String类似,只不过StringBuffer在进行字符串处理时不生成新的对象,下面我们就来详解Java中字符串缓冲区StringBuffer类的使用:
    2016-06-06
  • Spring boot jpa 删除数据和事务管理的问题实例详解

    Spring boot jpa 删除数据和事务管理的问题实例详解

    这篇文章主要介绍了Spring boot jpa 删除数据和事务管理的问题实例详解,涉及业务场景的一些知识和遇到的的问题,需要的朋友可以参考。
    2017-09-09
  • spring mvc实现登录账号单浏览器登录

    spring mvc实现登录账号单浏览器登录

    这篇文章主要为大家详细介绍了spring mvc实现登录账号单浏览器登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 解决Eclipse打开.java文件异常,提示用系统工具打开的问题

    解决Eclipse打开.java文件异常,提示用系统工具打开的问题

    这篇文章主要介绍了解决Eclipse打开.java文件异常,提示用系统工具打开的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Struts2访问Servlet的三种方式

    Struts2访问Servlet的三种方式

    这篇文章主要介绍了Struts2访问Servlet的三种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论