总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

Path path = Paths.get(“D:\data\test1”);

Files.delete(path); //返回值void

}

//如果文件不存在,返回false,表示删除失败(文件不存在)

//如果文件夹里面包含文件,抛出DirectoryNotEmptyException

@Test

void testDeleteFileDir4() throws IOException {

Path path = Paths.get(“D:\data\test1”);

boolean result = Files.deleteIfExists(path);

System.out.println(result);

}




归根结底,建议大家使用java NIO的`Files.delete(Path path)`和`Files.deleteIfExists(Path path);`进行文件或文件夹的删除。



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

-----------------------------------------------------------------------------



上文已经说了,那四个API删除文件夹的时候,如果文件夹包含子文件,就会删除失败。那么,如果我们确实想删除整个文件夹,该怎么办?



### []( )前提准备



为了方便我们后面进行试验,先去创建这样一个目录结构,“.log”结尾的是数据文件,其他的是文件夹



![](https://img-blog.csdnimg.cn/20200901075113428.png)



可以使用代面的代码进行创建



private void createMoreFiles() throws IOException {

Files.createDirectories(Paths.get(“D:\data\test1\test2\test3\test4\test5\”));

Files.write(Paths.get(“D:\data\test1\test2\test2.log”), “hello”.getBytes());

Files.write(Paths.get(“D:\data\test1\test2\test3\test3.log”), “hello”.getBytes());

}




### []( )2.1. walkFileTree与FileVisitor



*   使用walkFileTree方法遍历整个文件目录树,使用FileVisitor处理遍历出来的每一项文件或文件夹

*   FileVisitor的visitFile方法用来处理遍历结果中的“文件”,所以我们可以在这个方法里面删除文件

*   FileVisitor的postVisitDirectory方法,注意方法中的“post”表示“后去做……”的意思,所以用来**文件都处理完成之后再去处理文件夹**,所以使用这个方法删除文件夹就可以有效避免文件夹内容不为空的异常,因为在去删除文件夹之前,该文件夹里面的文件已经被删除了。



@Test

void testDeleteFileDir5() throws IOException {

createMoreFiles();

Path path = Paths.get(“D:\data\test1\test2”);

Files.walkFileTree(path,

  new SimpleFileVisitor<Path>() {

     // 先去遍历删除文件

     @Override

     public FileVisitResult visitFile(Path file,

                              BasicFileAttributes attrs) throws IOException {

        Files.delete(file);

        System.out.printf("文件被删除 : %s%n", file);

        return FileVisitResult.CONTINUE;

     }

     // 再去遍历删除目录

     @Override

     public FileVisitResult postVisitDirectory(Path dir,

                                     IOException exc) throws IOException {

        Files.delete(dir);

        System.out.printf("文件夹被删除: %s%n", dir);

        return FileVisitResult.CONTINUE;

     }



  }

);

}




下面的输出体现了文件的删除顺序



文件被删除 : D:\data\test1\test2\test2.log

文件被删除 : D:\data\test1\test2\test3\test3.log

文件夹被删除 : D:\data\test1\test2\test3\test4\test5

文件夹被删除 : D:\data\test1\test2\test3\test4

文件夹被删除 : D:\data\test1\test2\test3

文件夹被删除 : D:\data\test1\test2




我们既然可以遍历出文件夹或者文件,我们就可以在处理的过程中进行过滤。比如:



*   按文件名删除文件或文件夹,参数Path里面含有文件或文件夹名称

*   按文件创建时间、修改时间、文件大小等信息去删除文件,参数BasicFileAttributes 里面包含了这些文件信息。



[]( )2.2.Files.walk

-----------------------------------------------------------------------



如果你对Stream流语法不太熟悉的话,这种方法稍微难理解一点,但是说实话也非常简单。



*   使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个`Stream<Path>`

*   对每一个遍历出来的结果进行处理,调用Files.delete就可以了。



@Test

void testDeleteFileDir6() throws IOException {

createMoreFiles();

Path path = Paths.get(“D:\data\test1\test2”);

try (Stream walk = Files.walk(path)) {

  walk.sorted(Comparator.reverseOrder())

     .forEach(DeleteFileDir::deleteDirectoryStream);

}

}

private static void deleteDirectoryStream(Path path) {

try {

  Files.delete(path);

  System.out.printf("删除文件成功:%s%n",path.toString());

} catch (IOException e) {

  System.err.printf("无法删除的路径 %s%n%s", path, e);

}

}




问题:**怎么能做到先去删除文件,再去删除文件夹?** 。 利用的是字符串的排序规则,从字符串排序规则上讲,“D:\\data\\test1\\test2”一定排在“D:\\data\\test1\\test2\\test2.log”的前面。所以我们使用“sorted(Comparator.reverseOrder())”把Stream顺序颠倒一下,就达到了先删除文件,再删除文件夹的目的。



下面的输出,是最终执行结果的删除顺序。



删除文件成功:D:\data\test1\test2\test3\test4\test5

删除文件成功:D:\data\test1\test2\test3\test4

删除文件成功:D:\data\test1\test2\test3\test3.log

删除文件成功:D:\data\test1\test2\test3

删除文件成功:D:\data\test1\test2\test2.log

删除文件成功:D:\data\test1\test2




[]( )2.3.传统IO-递归遍历删除文件夹

---------------------------------------------------------------------------



传统的通过递归去删除文件或文件夹的方法就比较经典了




# 总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

![面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】](https://img-blog.csdnimg.cn/img_convert/8ea90b61e80442204e97a06aad44a8d6.webp?x-oss-process=image/format,png)



去删除文件或文件夹的方法就比较经典了




# 总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

[外链图片转存中...(img-6hJaMnV2-1714702842517)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值