目录列表器
1.获取目录列表, 可以用两种方法使用File对象. (list()方法带参数和不带参数)
package com.zachary.file; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * 目录列表器 * @author Zachary.Zheng * @version 1.0 * @date 2019年11月9日 */ public class DirList { // {Args: DirList2.java DirList.java} public static void main(String[] args) { File path = new File("src/com/zachary/io/util"); String[] list; if (args.length == 0) { // 不带参数的list()方法, 获得file对象的全部列表 list = path.list(); for (String dirItem : list) { System.out.println(dirItem); } } else { System.out.println(path.getName()); System.out.println(path.list()); /* * 1. 回调函数. * 2. 更具体的说, 就是一个策略模式的例子. * 3. 这里的回调函数用于过滤得到想要的文件 */ list = path.list(new DirFilter(args[0])); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); System.out.println("========================"); PPrint.pprint(list); PPrint.pprint(list); System.out.println("========================"); for (String dirItem : list) { System.out.println(dirItem); } System.out.println("========================"); // 回调函数. 更具体的说, 就是一个策略模式的例子 list = path.list(new DirFilter(args[1])); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for (String dirItem : list) { System.out.println(dirItem); } } } } class DirFilter implements FilenameFilter { /** * java与正则相关的工具主要在java.util.regex包中;此包中主要有两个类:Pattern、Matcher。 * Pattern * 声明:public final class Pattern implements java.io.Serializable * Pattern类有final 修饰,可知他不能被子类继承。 * 含义:模式类,正则表达式的编译表示形式。 * 注意:此类的实例是不可变的,可供多个并发线程安全使用。 */ private Pattern pattern; public DirFilter(String regex) { pattern = Pattern.compile(regex); } @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }
2.匿名内部类
package com.zachary.file; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * @author Zachary.Zheng * @version 1.0 * @date 2019年11月9日 */ public class DirList2 { // 参数是final, 这在内部类中是必需的, 这样才能够使用来自该范围之外的对象 public static FilenameFilter filter(final String regex) { // 过滤获得指定类型的文件 return new FilenameFilter() { private Pattern pattern = Pattern.compile(regex); @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }; // 末尾必须要有分号 } // {Args: DirList2.java DirList.java} public static void main(String[] args) { File path = new File("src/com/zachary/io/util"); String[] list; if (args.length == 0) { list = path.list(); for (String dirItem : list) { System.out.println(dirItem); } } else { list = path.list(filter(args[0])); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for (String dirItem : list) { System.out.println(dirItem); } System.out.println("========================"); list = path.list(filter(args[1])); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for (String dirItem : list) { System.out.println(dirItem); } } } } /* DirList2.java ======================== DirList.java *///:~
3.进一步改进, 因为现在FilenameFilter类紧密的和DirList2绑定在一起. 定义一个作为list()参数的匿名内部类. 使程序变的更小.
package com.zachary.file; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.regex.Pattern; /** * @author Zachary.Zheng * @version 1.0 * @date 2019年11月9日 */ public class DirList3 { public static void main(String[] args) { File path = new File("src/com/zachary/io/util"); String[] list; if (args.length == 0) { list = path.list(); for (String dirItem : list) { System.out.println(dirItem); } } else { list = path.list(new FilenameFilter() { private Pattern pattern = Pattern.compile(args[0]); @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for (String dirItem : list) { System.out.println(dirItem); } } } }