(14)理解“封装”之搜索文件夹下指定类型的文件

上一节讲了用递归算法遍历文件夹。【递归算法之遍历文件目录

承接上节的算法,做一个查找指定类型的文件,比如说,你想找出磁盘中所有的 RMVB,AVI,MP4文件,那么,用java程序搜索一下。

首先看一个不够灵活的程序:

						/**
						 * 遍历文件目录
						 * @param path
						 */
						public static void searchFolder(String path){
							File file=new File(path);
							if(file.exists()){
								File[] files=file.listFiles();
								if(files.length>0){
									for(int i=0;i<files.length;i++){
										if(files[i].isDirectory()){
											System.out.println(">>>进入文件夹:"+files[i].getAbsolutePath());
											searchFolder(files[i].getAbsolutePath());
										}else{
											//加入部分
											if(files[i].getName().toLowerCase().endsWith(".mp4")||files[i].getName().toLowerCase().endsWith(".rmvb")
													||files[i].getName().toLowerCase().endsWith(".avi")){
												System.out.println(files[i].getAbsolutePath());
											}
										}
									}
								}else{
									System.out.println("文件夹下没有文件夹或文件");
								}
							}else{
								System.out.println("文件目录不存在");
							}
						}

    

运行后,确实把所有的mp4,rmvb,avi文件查询打印出来了。

那么问题来了,我要是想搜 txt 类型的文件呢?

你可能会说在if条件中加个判断就行了。但是我突然又想搜xml,html,bat,vbs,qvod.exe等等了,每搜一个就在if中加一个判断,不仅维护起来麻烦,而且代码很庞大。

于是,我们使用了另一种的方式:

						/**
						 * 遍历文件目录
						 * @param path
						 */
						public static void searchFolder(String path){
							File file=new File(path);
							if(file.exists()){
								File[] files=file.listFiles();
								if(files.length>0){
									for(int i=0;i<files.length;i++){
										if(files[i].isDirectory()){
											System.out.println(">>>进入文件夹:"+files[i].getAbsolutePath());
											searchFolder(files[i].getAbsolutePath());
										}else{
											if(isSearchFile(files[i].getAbsolutePath())){
												System.out.println(files[i].getAbsolutePath());
											}
										}
									}
								}else{
									System.out.println("文件夹下没有文件夹或文件");
								}
							}else{
								System.out.println("文件目录不存在");
							}
						}
						/**允许搜索的文件类型*/
						public final static String[] SEARCH_TYPE=new String[]{".mp4",".rmvb",".avi",".jpg","qvod.exe"};
						/***
						 * 判断是否为需要搜索的文件
						 * @param path
						 * @return
						 */
						public static boolean isSearchFile(String path){
							for(int i=0;i<SEARCH_TYPE.length;i++){
								if(path.toLowerCase().endsWith(SEARCH_TYPE[i])){
									return true;
								}
							}
							return false;
						}


我们新增了一个方法专门用来搜索指定类型的文件,一个常量用来保存需要搜索的文件类型。现在,我想搜什么就搜什么,只需修改SEARCH_TYPE就行了。相对于一大堆if条件拼起来的代码,这个自然方便的多,而且维护起来也简单。然后,我们成功搜索到了qvod.exe在哪个目录下。

你可能会说,没必要单独写个方法,直接把for循环写在searchFolder方法中就行了。

看上去似乎是这样的,没有瑕疵。

如果我未来要实现搜索所有文件名中含有"abc"的功能,我就会在searchFolder中加一大段代码。单独拆出一个方法,不管用什么样的条件去搜索,searchFolder方法的代码不需要改变,它只从isSearchFile接收一个结果,至于你isSearch里面做了些什么,searchFolder不管。从而实现了业务分离。

这是一个利用封装降低代码耦合度,提高代码可维护性的小例子。

你或许会想:封装在什么情况下用?

个人经验:设计程序时,若某块功能在后续可能会有很大的改动,将其封装成一个模块;这段代码可能会在多个地方用到,封装成一个模块;多写多设计,熟能生巧。

无他,唯手熟尔。