JAVA删除文件或者文件夹

文章目录

  • 一、JAVA删除文件或者空文件夹的四种基本方法
      • File类的delete()
      • File类的deleteOnExit()
      • Files类的delete(Path path)
      • Files类的deleteIfExists(Path path)
      • 总结
  • 二、如何删除整个目录或者目录中的部分文件
      • 使用FileVistor遍历文件和目录
      • Files.walkFileTree删除指定文件夹所有文件(代码演示)
  • 总结


一、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方法来遍历文件和子目录。
JAVA删除文件或者文件夹_第1张图片
这两个方法都需要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方法按自己的规则编写就行。如果有疑问或者更好的意见欢迎留言。

你可能感兴趣的:(java,开发语言)