一、概述
java零基础教学也讲了一阵子了,从jdk安装到第一个java程序再到如今的java File类,递归思想等,不知道你们对于此教学有没有啥建议,毕竟看着浏览量不是很可人,所以在开启此篇前,我想统计一下,是不是对我这个教学不是很感兴趣啊?如果有何不适的地方,欢迎大家提出宝贵的建议,好不好,我会采取并调整,因为我的目的也是想把这个教学做好,尽可能的帮助到更多的小伙伴,有一个好的引导。
回归正题,对于上几期的教学,我们是针对性的讲解了File类的基础知识点及实战演示,以及递归思想的运用,不知道你们是否有掌握?如果还没有掌握透彻,欢迎回到我之前的几期文章中进行知识补充。
可能有小伙伴会问了,这一期我准备讲什么呀?很简单,模拟个实际的场景,然后将这几期讲到的知识点都运用进去。
二、场景描述
1️⃣业务描述
我最近有做到一块业务,正好跟现在讲到的知识点很接近,,于是我就想跟大家聊聊。大概的要求就是要将一个文件夹下所有人里头所对应的文件资源都搜找出来,就对于这么个业务?你们可能会说,这不就是遍历就好了呀!是的,没错,但是如果我说要你结合递归来实现,你们知道将递归的思想运用到哪上面么?如果不是很清晰可以再好好想想啊。
2️⃣分析
- 针对目录搜素,无法判断到底有多少级目录,所以递归就可以派上用处了。遍历所有的目录,对于是文件夹就接着递归。
- 遍历目录时,对获取的子文件,判断其文件名,取出符合要求的文件即可,比如只取.pdf后缀的文件。
3️⃣代码实现
通过上述所对场景的解析,其实代码实现就相对清晰了,如下我先给大家模拟一下场景,制造一个多文件夹带子文件的现象,然后再对其进行递归遍历。
然后对其有不同层级的进行pdf文件创建,也有其他后缀的文件,尽量模拟的逼真一些。
第一步:
我们直接来定义一个递归方法。入参就为一个File类,一个List<String> paths。我是要将符合要求的文件的绝对路径获取并用集合存储。
其中有一点我给个提示,FilenameUtils.getExtension(file)
方法会直接返回一个不带点的后缀,比如FilenameUtils.getExtension("test.pdf")
,该方法是返回"pdf",其实如果你不用FilenameUtils文件工具类,你们也可以通过String自身提供的substring()
方法截取也行,我这里就不一一演示了。
我还是直接用封装好的工具类来处理,然后.toLowerCase()方法是将其字符串统一转成小写字母,这样的好处也是避免有符合要求的pdf格式的文件漏网。
好啦,我来带着你们敲一遍,后续你们可以看我写的。仅供参考哈。
具体代码如下:
public void getFiles(File dir, List<String> paths) {
//获取子文件和目录
File[] files = dir.listFiles();
//遍历处理
for (File file : files) {
//如果是文件,判断是否符合要求。
if (file.isFile()) {
//判断是否为.pdf后缀的文件,是则将绝对路径保存到paths中
//获取文件后缀
String imageSuffix = FilenameUtils.getExtension(file.getName()).toLowerCase();
if ("pdf".equals(imageSuffix)) {
paths.add(file.getAbsolutePath());
}
}else{
//递归接着下钻
getFiles(file,paths);
}
}
}
注意,一定要注意使用递归时,要确定递归的终止条件,而我这里就是对有限的文件目录进行遍历,遍历完了其实也就直接结束了。然后对于file判断,我们只需要判断该file是不是文件即可,其file也提供了 isFile()方法,若是文件,返回true,不是文件,则返回false,所以false,也就是进入递归的前置条件, 然后将该file作为 入参, paths接着传入。
第二步:
如上的递归我们已经写好,接着我们就需要定义一个test测试启动类了。我们先来创建一个File类,其入值直接将我们刚才创建的Test文件夹目录地址给进去即可。然后进行递归方法的调用。再将其paths进行遍历打印。
具体代码如下:
@Test
public void test() {
//用于呈装所有的.pdf后缀的文件
List<String> filePaths = new ArrayList<>();
//创建file对象
File file = new File("C:/Users/86157/Desktop/test");
this.getFiles(file, filePaths);
//输出
filePaths.forEach(p -> {
System.out.println(p);
});
}
第三步:
执行调用其递归方法后,我们来看下控制台打印结果。
4️⃣总结
你们可以看下,其打印的绝对地址,从地址上看,是不是很贴切其套娃式的文件模式,因为对于现实场景,我们也不清楚到底嵌套了几层,所以我如上演示,已经很贴近我那真是业务场景了,你们可以参考下。