18.1.1 目录列表器

来源:互联网 发布:企业整站源码 编辑:程序博客网 时间:2024/05/17 22:12

一个利用FILE类获取文件列表的示例, 示例中利用过滤器实现了列表过滤

package com.cnsuning.src;import java.io.File;import java.io.FilenameFilter;import java.util.Arrays;import java.util.regex.Pattern;public class Main {public static void main(String[] args) {File dir = new File("D:\\download");String[] dirList;if(args.length==0){dirList = dir.list();}else{dirList = dir.list(new DirFilter(args[0]));}Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);for(String fileName : dirList){System.out.println(fileName);}}}class DirFilter implements FilenameFilter{private Pattern pattern;DirFilter (String preg){pattern = Pattern.compile(preg);}@Overridepublic boolean accept(File file, String fileName) {// TODO Auto-generated method stubreturn pattern.matcher(fileName).matches();}}

命令好参数:[\w]*\.zip

结果:

AdbeRdr940_zh_CN.zip
JAVAAPI_CN.zip
qrcode.zip
SQLyogTrial.zip

特别的, 书中提到这里的list()和过滤器结合使用是一种命令模式的思想, list 在设计中是会接收一个FilenameFilter接口来实现文件列表过滤, 而具体的策略由用户实现接口来决定. 可见策略模式的核心思想是利用接口来实现, 通过暴露可编码接口给用户实现具体算法无关性的便利. 而策略这个词更多的体现的是应用场景, 说的是接口支持的一组策略这种场景, 体现了该设计的便利性和合理性.

上边的代码还可以改写为匿名内部类的实现方式

package com.cnsuning.src;import java.io.File;import java.io.FilenameFilter;import java.util.Arrays;import java.util.regex.Pattern;public class Main {public static void main(String[] args) {File dir = new File("D:\\download");String[] dirList;if(args.length==0){dirList = dir.list();}else{dirList = dir.list(getNameFilter(args[0]));}Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);for(String fileName : dirList){System.out.println(fileName);}}public static FilenameFilter getNameFilter(final String regex){return new FilenameFilter(){Pattern namePattern = Pattern.compile(regex); //使用的外部变量必须为finalpublic boolean accept(File file,String fileName){return namePattern.matcher(fileName).matches();}};}}

更近一步的, 匿名内部类还可以做为参数出现

package com.cnsuning.src;import java.io.File;import java.io.FilenameFilter;import java.util.Arrays;import java.util.regex.Pattern;public class Main {public static void main(final String[] args) {File dir = new File("D:\\download");String[] dirList;if(args.length==0){dirList = dir.list();}else{dirList = dir.list(new FilenameFilter(){Pattern namePattern = Pattern.compile(args[0]); //使用的外部变量必须为finalpublic boolean accept(File file,String fileName){return namePattern.matcher(fileName).matches();}});}Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);for(String fileName : dirList){System.out.println(fileName);}}}

在这个匿名内部类改写例子的基础上, 书中提到了匿名内部类应用在代码中的优缺点:

优点: 将解决特定问题的代码隔离, 聚拢在一点

缺点: 不易阅读(这个是显而易见的)

我觉得只要运用纯熟, 匿名内部类对编写特定代码还是很好的.

0 0