解决方案 »

  1.   

    主方法类Test.java:import java.io.*;public class Test {    public interface Strategy {        void process(File file);
        }
        private Strategy strategy;
        private String ext;    public Test(Strategy strategy, String ext) {
            this.strategy = strategy;
            this.ext = ext;
        }    public void start(String[] args) {
            try {
                if (args.length == 0) {
                    processDirectoryTree(new File("."));
                } else {
                    for (String arg : args) {
                        File fileArg = new File(arg);
                        if (fileArg.isDirectory()) {
                            processDirectoryTree(fileArg);
                        } else {
                            // Allow user to leave off extension:
                            if (!arg.endsWith("." + ext)) {
                                arg += "." + ext;
                            }
                            strategy.process(
                                    new File(arg).getCanonicalFile());
                        }
                    }
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }    public void
                processDirectoryTree(File root) throws IOException {
            for (File file : Directory.walk(
                    root.getAbsolutePath(), ".*\\." + ext)) {
                strategy.process(file.getCanonicalFile());
            }
        }    // Demonstration of how to use it:
        public static void main(String[] args) {
            new Test(new Test.Strategy() {
                public void process(File file) {
                    System.out.println(file);
                }
            }, "java").start(args);
        }
    } /* (Execute to see output) *///:~Directory.javaimport java.util.regex.*;
    import java.io.*;
    import java.util.*;public final class Directory {    public static File[]
                local(File dir, final String regex) {
            return dir.listFiles(new FilenameFilter() {
                private Pattern pattern = Pattern.compile(regex);            public boolean accept(File dir, String name) {
                    return pattern.matcher(
                            new File(name).getName()).matches();
                }
            });
        }    public static File[]
                local(String path, final String regex) { // Overloaded
            return local(new File(path), regex);
        }    // A two-tuple for returning a pair of objects:
        public static class TreeInfo implements Iterable<File> {        public List<File> files = new ArrayList<File>();
            public List<File> dirs = new ArrayList<File>();        // The default iterable element is the file list:
            public Iterator<File> iterator() {
                return files.iterator();
            }        void addAll(TreeInfo other) {
                files.addAll(other.files);
                dirs.addAll(other.dirs);
            }        public String toString() {
                return "dirs: " + PPrint.pformat(dirs)
                        + "\n\nfiles: " + PPrint.pformat(files);
            }
        }    public static TreeInfo
                walk(String start, String regex) { // Begin recursion
            return recurseDirs(new File(start), regex);
        }    public static TreeInfo
                walk(File start, String regex) { // Overloaded
            return recurseDirs(start, regex);
        }    public static TreeInfo walk(File start) { // Everything
            return recurseDirs(start, ".*");
        }    public static TreeInfo walk(String start) {
            return recurseDirs(new File(start), ".*");
        }    static TreeInfo recurseDirs(File startDir, String regex) {
            TreeInfo result = new TreeInfo();
            for (File item : startDir.listFiles()) {
                if (item.isDirectory()) {
                    result.dirs.add(item);
                    result.addAll(recurseDirs(item, regex));
                } else // Regular file
                if (item.getName().matches(regex)) {
                    result.files.add(item);
                }
            }
            return result;
        }    // Simple validation test:
        public static void main(String[] args) {
            if (args.length == 0) {
                System.out.println(walk("."));
            } else {
                for (String arg : args) {
                    System.out.println(walk(arg));
                }
            }
        }
    } ///:~PPrint.javaimport java.util.*;public class PPrint {    public static String pformat(Collection<?> c) {
            if (c.size() == 0) {
                return "[]";
            }
            StringBuilder result = new StringBuilder("[");
            for (Object elem : c) {
                if (c.size() != 1) {
                    result.append("\n  ");
                }
                result.append(elem);
            }
            if (c.size() != 1) {
                result.append("\n");
            }
            result.append("]");
            return result.toString();
        }    public static void pprint(Collection<?> c) {
            System.out.println(pformat(c));
        }    public static void pprint(Object[] c) {
            System.out.println(pformat(Arrays.asList(c)));
        }
    } ///:~