一、删除文件或文件夹的四种基础方法

面的四个方法都可以删除文件或文件夹,它们的共同点是:当文件夹中包含子文件的时候都会删除失败,也就是说这四个方法只能删除空文件夹。

  • File类的delete()
  • File类的deleteOnExit()
  • Files.delete(Path path)
  • Files.deleteIfExists(Path path);

//false只能告诉你失败了 ,但是没有给出任何失败的原因
@Test
void testDeleteFileDir1()  {File file = new File("D:\\data\\test");boolean deleted = file.delete();System.out.println(deleted);
}//void ,删除失败没有任何提示,应避免使用这个方法,就是个坑
@Test
void testDeleteFileDir2()  {File file = new File("D:\\data\\test1");file.deleteOnExit();
}//如果文件不存在,抛出NoSuchFileException
//如果文件夹里面包含文件,抛出DirectoryNotEmptyException
@Test
void testDeleteFileDir3() throws IOException {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);
}

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

前提准备

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

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>() {// 先去遍历删除文件@Overridepublic FileVisitResult visitFile(Path file,BasicFileAttributes attrs) throws IOException {Files.delete(file);System.out.printf("文件被删除 : %s%n", file);return FileVisitResult.CONTINUE;}// 再去遍历删除目录@Overridepublic FileVisitResult postVisitDirectory(Path dir,IOException exc) throws IOException {Files.delete(dir);System.out.printf("文件夹被删除: %s%n", dir);return FileVisitResult.CONTINUE;}});}

2.2.Files.walk

  • 使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个Stream
  • 对每一个遍历出来的结果进行处理,调用Files.delete就可以了。
@Test
void testDeleteFileDir6() throws IOException {createMoreFiles();Path path = Paths.get("D:\\data\\test1\\test2");try (Stream<Path> 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顺序颠倒一下,就达到了先删除文件,再删除文件夹的目的。

2.3.传统IO-递归遍历删除文件夹

//传统IO递归删除
@Test
void testDeleteFileDir7() throws IOException {createMoreFiles();File file = new File("D:\\data\\test1\\test2");deleteDirectoryLegacyIO(file);}private void deleteDirectoryLegacyIO(File file) {File[] list = file.listFiles();  //无法做到list多层文件夹数据if (list != null) {for (File temp : list) {     //先去递归删除子文件夹及子文件deleteDirectoryLegacyIO(temp);   //注意这里是递归调用}}if (file.delete()) {     //再删除自己本身的文件夹System.out.printf("删除成功 : %s%n", file);} else {System.err.printf("删除失败 : %s%n", file);}
}
  • listFiles()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件,如果这个抽象路径名不表示一个目录,那么这个方法返回null。否则File对象数组返回。
  • 先去递归删除子文件夹,再去删除文件夹自己本身

java 删除文件或文件夹的7种方法(io基础)相关推荐

  1. java删除数组中重复元素的几种方法

    Java操控数组,删除数组中所有的重复元素,使其数组元素全部唯一,有以下几种方法: 1,使用set(最好想到),set本身就是不重复的集合: package Array_test;import jav ...

  2. java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力. 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件 ...

  3. java 自动删除文件夹权限_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇...

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力.为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或 ...

  4. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  5. 怎么在mac打开home文件夹? mac打开home文件夹的两种方法

    今天小编给大家带来怎么在mac打开home文件夹? mac打开home文件夹的两种方法教程,那么具体该怎么打开呢?下面我们就来看看mac打开home文件夹的两种方法,需要的朋友可以参考下.记得收藏哦 ...

  6. u盘扫描并修复后文件消失了怎么办?2种方法帮助找回

    演示机型:技嘉 H310M HD22.0 系统版本:Windows 10 专业版 软件版本:云骑士数据恢复软件3.21.0.17 案例分享:"我的u盘每次插电脑都会弹出要不要扫描并修复的提示 ...

  7. python获取绝对路径_python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworki ...

  8. 怎么将pdf文件转换成图片?三种方法

    在实际的工作过程中,PDF是非常常见的文档存储格式,也是很多网站默认的保存格式.对于PDF文件来说,其具备很多其他文件格式没有的优势和特点.例如,在PDF文件中,其排版整齐且固定,浏览直观且方便,为工 ...

  9. 数据导出到excel文件给客户端下载的几种方法

    (原创)datagrid数据导出到excel文件给客户端下载的几种方法 看到这个觉得这个人很厉害,mvp啊. 我就改成这个样子了.  Response.Clear();         Respons ...

  10. 让Mac复制文件到U盘的两种方法

    2019独角兽企业重金招聘Python工程师标准>>> 让Mac复制文件到U盘的两种方法 一.让Mac支持ntfs格式磁盘 下载安装tuxera ntfs这款Mac读写软件,然后在系 ...

最新文章

  1. 运用贪心思想解决跳跃游戏
  2. 前端学习(1991)vue之电商管理系统电商系统之实现商品的分页功能
  3. Nagios---NRPE
  4. linux的cache memory解析
  5. 【shell】Shell编程的前篇以及通过编程实现,jdk的安装
  6. pycharm打开脚本报错Gtk-Message: Failed to load module canberra-gtk-module
  7. 用CommonDialog公共对话框选取多个文件
  8. 程序员生存定律——打造属于自己的稀缺性(转载)
  9. 微信小程序事件绑定无效
  10. c语言 从文件中读取车牌,输入一个车牌号写入文件,找出所有后四位是一个完全平方数的车牌号并输出
  11. 西门子g120变频器接线图_【直播】S71200与SINAMICS G120变频器的profinet通信
  12. 安信可IDE使用教程 加入阿里云平台
  13. 3G来了,我们能干点啥软件?(转)
  14. 父传子 子传父以及兄弟之间传值
  15. Python 解析log日志
  16. App Inventor 2 连接调试器的各种方式比较
  17. 安卓开发为什么选择用Java语言
  18. 110款表白网站源码,搭建表白网站必备,总有一款适合你
  19. 组件化开发——支付中心
  20. nib must contain exactly one top level object which must be a UITableViewCell instance

热门文章

  1. JAVA程序员必看的15本书-JAVA自学书籍推荐
  2. 2022年最新版黑马程序员Java自学路线(免费分享)
  3. c语言函数调用求阶乘和
  4. 更改图书信息c语言编码,图书管理系统C语言实现源代码.pdf
  5. 罗技 连点 脚本_罗技 G502 无线版体验:告别了线材,而且变得更轻了
  6. 【MFC开发(8)】下拉框控件Combo Box
  7. python urlretrieve下载进度_python《文件下载进度显示》 urllib.request.urlretrieve(self.__path,self.__name,jindu)...
  8. win10配置hadoop开发环境
  9. 2022年6月TIOBE编程语言排名:Python、C、Java
  10. 盘点那些没用的上网小技巧-主流直播平台直播源的获取(适用potplayer)