java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JAVA删除文件或者文件夹

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

作者:对酒当歌丶人生几何

文章介绍了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异常。推荐使用

总结:

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

在演示如何删除整个目录或者目录中部分文件时,让我们先谈论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方法按自己的规则编写就行。

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

您可能感兴趣的文章:
阅读全文