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. 小记同学一次奇葩的DNS欺骗实验失败经历

    这是一个DNS欺骗实验,使用kali的ettercap.有受害者.攻击者(虚拟机).Web服务器三台机器.受害者的事124.16.70.105虚拟机的是124.16.71.48web服务器是124.1 ...

  2. 数据可视化图表ECharts

    介绍: ECharts是一个基于ZRender(轻量级Canvas类库)的纯javascript图表库,提供可交互.个性化的数据可视化图表. ECharts提供了折线图.柱状图.散点图.饼图.K线图, ...

  3. Android手机导出文件

    因为要写联系人相关的东西,所以得把db导出来看看 第一步:Root手机 尝试了几个Root工具,发现就KingRoot能root 第二个:编写bat脚本 脚本内容是先将DB文件从/data/data ...

  4. 常见的几个Qt编程问题的处理(转自QT中文论坛)(挺实用的)

    1.如何在窗体关闭前自行判断是否可关闭答:重新实现这个窗体的closeEvent()函数,加入判断操作 void MainWindow::closeEvent(QCloseEvent*event){i ...

  5. VS2013编译Qt5.6.0静态库,并提供了百度云下载(乌合之众)good

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

  6. ThoughtWorks 面试备忘录

    ThoughtWorks 面试备忘录 前言 前段时间 ThoughtWorks 在网上和拉勾网合作搞了一次网络招聘,名为抛弃简历!让代码说话!,可谓赚足了眼球,很多程序猿纷纷摩拳擦掌.踊跃提交代码,在 ...

  7. Python自动化测试 (八)unittest 单元测试

    任何一种编程语言, 都会有单元测试框架, 本文介绍Python 自带的unittest模块 # -* - coding: UTF- -* - class Myclass: def sum(self,x ...

  8. SecureCRT的安装以及破破解(内含安装包)

    1.百度网盘连接:链接:https://pan.baidu.com/s/13i8sblGthYtj2SbUTrbmsg  提取码:8cw1 2.解压前先关闭电脑防护软件,否则会杀掉破解软件的 3.压缩 ...

  9. SpringBoot系列——加载自定义配置文件

    前言 SpringBoot启动时默认加载bootstrap.properties或bootstrap.yml(这两个优先级最高).application.properties或application. ...

  10. 用arduino制作具有无限数据传输功能的气象站

    本项目是用arduino开源硬件,来快速制作具有无限数据传输功能的气象站,我之前做过一个带数据记录功能的气象站项目,这次算是升级和改进的版本. 第1步:构想 首先,需要增加从气象站到室内接收器的无线数 ...