上一节讲了用递归算法遍历文件夹。【递归算法之遍历文件目录】
承接上节的算法,做一个查找指定类型的文件,比如说,你想找出磁盘中所有的 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不管。从而实现了业务分离。
这是一个利用封装降低代码耦合度,提高代码可维护性的小例子。
你或许会想:封装在什么情况下用?
个人经验:设计程序时,若某块功能在后续可能会有很大的改动,将其封装成一个模块;这段代码可能会在多个地方用到,封装成一个模块;多写多设计,熟能生巧。
无他,唯手熟尔。