目录列表器

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);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/zhongli1/p/11831920.html