import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import java.io.File;
import java.io.FilenameFilter;

public class Test {
    public static void main(String[] args) {
//        DirectoryDemo.test();
        ProcessFileTest.test();
        ProcessFileTest.test2();

    }
}

/*
    local():产生由本地目录中的文件构成的File对象数组
    walk():产生给定目录下的由整个目录书中所有文件构成的List<File>
 */

class Directory {
    public static File[] local(File dir, String regex) {
        return dir.listFiles(new FilenameFilter() {
            Pattern pattern = Pattern.compile(regex);
            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        });
    }

    public static class TreeInfo implements Iterable<File>{

        public List<File> dirs = new ArrayList<>();
        public List<File> files = new ArrayList<>();

        public TreeInfo() {

        }

        public void addAll(TreeInfo infos) {
            this.dirs.addAll(infos.dirs);
            this.files.addAll(infos.files);
        }

        @Override
        public Iterator<File> iterator() {
            return files.iterator();
        }

        public String toString() {
            return "dirs: " + PPrint.pformat(dirs) + "\n\nfiles:" + PPrint.pformat(files);
        }
    }

    public static File[] local(String path, String regex) {
        return local(new File(path),regex);
    }

    private 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 {
                //这个地方的写法和我之前看到的不太一样
                if (item.getName().matches(regex)) {
                    result.files.add(item);
                }
            }
        }
        return result;
    }

    public static TreeInfo walk(String start, String regex) {
        return recurseDirs(new File(start),regex);
    }

    public static TreeInfo walk(File start, String regex) {
        return recurseDirs(start, regex);
    }

    public static TreeInfo walk(String start) {
        return recurseDirs(new File(start), ".*");
    }
}

class PPrint {
    public static String pformat(Collection<?> collection) {
        if (collection.size() == 0) {
            return "[]";
        }

        StringBuilder result = new StringBuilder("[");
        for (Object elem : collection) {
            if (collection.size() != 1) {
                result.append("\n   ");
            }
            result.append(elem);
        }
        if (collection.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[] objects) {
        System.out.println(pformat(Arrays.asList(objects)));
    }
}

class DirectoryDemo {
    public static void test() {
        PPrint.pprint(Directory.walk(".").dirs);
    }
}

/*
    创建一个工具,它可以在目录中穿行,并且根据Strategy对象来处理这些目录中的文件

    书中案例的逻辑:
        1.针对上一个案例中walk方法计算出来的所有文件,执行一个策略方法

 */

//书中原代码:
/*
    ProcessFiles的工作是:执行查找具有特定扩展名的文件的所有工作
    Strategy的工作是:查找到指定的文件后,执行某个指定的算法
 */
class ProcessFiles {
    public interface Strategy {
        void process(File file);
    }

    private Strategy strategy;
    private String ext;

    public ProcessFiles(Strategy s,String ext){
        this.strategy=s;
        this.ext=ext;
    }

    public void processDirectoryTree(File root) throws IOException {
        for (File file : Directory.walk(root.getAbsolutePath(), ".*\\." + ext)) {
            strategy.process(file.getCanonicalFile());
        }
    }

    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{
                        if(!arg.endsWith("."+ext))
                            arg+="."+ext;
                        strategy.process(new File(arg).getCanonicalFile());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//改进后代码
interface IStrategy{
    void process(File file);
}

class ProcessFiles1 {
    private IStrategy strategy;
    private String ext;

    public ProcessFiles1(IStrategy strategy, String ext) {
        this.strategy=strategy;
        this.ext=ext;
    }

    public void start(String[] paths){
        for(String path:paths){
            start(path);
        }
    }

    public void start(String path) {
        core(new File(path));
    }

    public void start(){
        start(".");
    }

    private void core(File root){
        if(root.isFile()){
            strategy.process(root);
            return;
        }
        for (File item : Directory.walk(root.getAbsolutePath(), ".*\\." + ext)) {
            strategy.process(root);
        }
        return;
    }

}

class ProcessFileTest {
    public static void test() {

        new ProcessFiles(new ProcessFiles.Strategy(){
            public void process(File file) {
                System.out.println(file);
            }
        },"java").start(new String[0]);

    }

    public static void test2() {
        new ProcessFiles1(new IStrategy(){
            public void process(File file) {
                try {
                    System.out.println(file.getCanonicalFile());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        },"java").start();
    }
}

Java编程思想:File类getCanonicalFile()方法,listFile()方法的更多相关文章

  1. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  2. java基础42 File类的构造函数及其方法

    本文知识点(目录): 1.IO流(Input Output)    2.IO流技术的运用场景    3.File类的构造函数(方法)    4.File类的一些常用方法    5.实例(解析File类 ...

  3. java编程思想-复用类(2)

    如果java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本(这一点与C++不同) class Homer { char doh(char c) { ...

  4. java编程思想-复用类

    /* 一个文件中只能有一个public类 并且此public类必须与文件名相同 */ class WaterSource { private String s; WaterSource() { Sys ...

  5. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  6. Java编程思想(四) —— 复用类

    看了老罗罗升阳的专訪,不由自主地佩服,非常年轻,我之前以为和罗永浩一个级别的年龄.也是见过的不是初高中编程的一位大牛之中的一个,专訪之后.发现老罗也是一步一个脚印的人. 别说什么难做,做不了.你根本就 ...

  7. java 方法调用绑定--《java编程思想》学习笔记

    将一个方法调用同一个方法主体关联起来,就是绑定. 绑定分两种 :前期绑定 和 后期绑定 . 绑定------------- | -----前期绑定-------编译期绑定 { static , fin ...

  8. Java编程思想(后)

    Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...

  9. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  10. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

随机推荐

  1. 解决iconv函数无法转换某些中文的问题

    原文: 解决iconv函数无法转换某些中文的问题 请先看以下代码,这个页面是GB2312编码的: $str = '陶喆';echo 'gb2312-'.$str;echo '<br />' ...

  2. Mono.Cecil - 0.6

    原文:Mono.Cecil - 0.6 项目地址:Mono.Cecil 项目描述:In simple English, with Cecil, you can load existing manage ...

  3. Have You Tried Delphi on Amazon Linux? (就是AWS用的Linux)

    The new Delphi Linux compiler enables customers to take new or existing Windows server applications ...

  4. no identifier specified for entity错误

    未给entity类添加主键造成. 之前出现这个错误是因为忘记给id添加@Id标签.

  5. JS解析Json 数据并跳转到一个新页面,取消A 标签跳转

    JS解析Json 数据并跳转到一个新页面,代码如下 $.getJSON("http://api.cn.abb.com/common/api/staff/employee/" + o ...

  6. TThread类详解

    TThread是一个抽象类,可以创建几个独立的线程.类关系 TObject在一个多线程的应用程序中创建一个TThread的后子类代表一个线程.每一新子类的TThread对象的实例是一个新的线程.从TT ...

  7. delphi资源文件制作及使用详解

    一.引子:现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是程 ...

  8. .Net Random产生随机数

    之前用winform做过有个摇奖游戏,其中中奖条件为产生的两个随机数一致则中奖,测试发现每次都会中奖. 忘记方式是怎么解决的了,今天看到了传智论坛的一片文章也是关于Random的,就点进去看了,它里面 ...

  9. 高启全:长江存储自主3D NAND,DRAM研发欢迎美光一起加入(千秋大业,慢慢做)

    台湾DRAM教父高启全转战大陆紫光集团操盘存储器大计划超过1年,日前晋升长江存储的执行董事.代行董事长,接受DIGITIMES独家专访公开未来规划:他指出,已齐聚500名研发人员在武汉投入3D NAN ...

  10. <iOS小技巧>UIview指定设置控件圆角

      一.用法:   众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型.   利用班赛尔曲线画角:   //利用班赛尔曲线画角 UIB ...