目录实用工具

1. 获取File对象的目录树. 文件夹下面是文件夹 递归调用, 直到没有发现文件夹为止. walk()方法将开始目录转换为File对象, 然后调用recurseDirs: 递归调用

package com.zachary.file;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @author Zachary.Zheng
 * @version 1.0
 * @date 2019年11月9日
 */
public class Directory {
    /**
     * 获取能匹配正则的文件夹名
     * local()的使用被称为listFile()的File.list()的变体来产生File数组
     * @param dir
     * @param regex
     * @return
     */
    public static File[] local(File dir, final String regex) {
        return dir.listFiles(new FilenameFilter() {
            private Pattern pattern = Pattern.compile(regex);

            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(new File(name).getName()).matches();
            }
        });
    }
    /**
     * 获取能匹配正则的文件夹名
     * @param path
     * @param regex
     * @return
     */
    public static File[] local(String path, final String regex) {
        return local(new File(path), regex);
    }
    public static class TreeInfo implements Iterable<File> {
        // 文件名称路径
        public List<File> files = new ArrayList<>();
        // 文件夹路径
        public List<File> dirs = new ArrayList<>();
        @Override
        public Iterator<File> iterator() {
            return files.iterator();
        }
        void addAll(TreeInfo other) {
            files.addAll(other.files);
            dirs.addAll(other.dirs);
        }
        @Override
        public String toString() {
            return "TreeInfo [dirs=" + PPrint.pformat(dirs) + ", \n\nfiles=" + PPrint.pformat(files) + "]";
        }
    }
    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), ".*");
    }
    public static TreeInfo walk(File start) {
        return recurseDirs(start, ".*");
    }
    /**
     * 获取目录树
     * recurse: 递归调用
     * 1.local()的使用被称为listFile()的File.list()的变体来产生File数组
     * 2.walk()方法将开始目录转换为File对象, 然后调用recurseDirs
     *     // 文件名称路径 持有所有文件
     *     public List<File> files = new ArrayList<>();
     *     // 文件夹路径 持有所以目录
     *     public List<File> dirs = new ArrayList<>();
     * @param startDir
     * @param regex
     * @return
     */
    static TreeInfo recurseDirs(File startDir, String regex) {
        TreeInfo result = new TreeInfo();
        // 文件夹也可以过滤
        for (File item : Directory.local(startDir, ".*")) {
            if(item.isDirectory()) {
                result.dirs.add(item);
                /*
                 * 1.文件夹下面是文件夹 递归调用, 直到没有发现文件夹为止.
                 * 2.将子文件夹中的目录结构复制给父文件夹
                 */
                result.addAll(recurseDirs(item, regex));
            } else {
                if(item.getName().matches(regex)) {
                    result.files.add(item);
                }
            }
        }
        return result;
    }
    public static void main(String[] args) {
        if(args.length == 0) {
            System.out.println(walk("."));
        } else {
            for (String arg : args) {
                System.out.println(walk(arg));
            }
        }
    }
}
///:~

2. PPrint格式化打印目录树工具

package com.zachary.file;

import java.util.Arrays;
import java.util.Collection;

/**
 * @author Zachary.Zheng
 * @version 1.0
 * @date 2019年11月9日
 */
public class PPrint {
    public static String pformat(Collection<?> c) {
        if(c.size() == 0) {
            return "[]";
        }
        StringBuffer result = new StringBuffer("[");
        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)));
    }
}
///:~

3.创建一个工具, 它可以在目录中穿行, 并根据Strategy对象来出理这些目录结构(这是策略模式的另一个实例)

package com.zachary.file;

import java.io.File;
import java.io.IOException;

/**
 * @author Zachary.Zheng
 * @version 1.0
 * @date 2019年11月9日
 */
public class ProcessFiles {
    /**
     * 定义回调函数接口
     * 在调用时实现
     * @author Zachary.Zheng
     * @version 1.0
     * @date 2019年11月9日
     */
    public interface Strategy{
        void process(File file);
    }
    private Strategy strategy;
    private String ext;
    public ProcessFiles(Strategy strategy, String ext) {
        super();
        this.strategy = strategy;
        this.ext = ext;
    }
    public ProcessFiles() {
        super();
    }

    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 (Exception e) {
            // TODO: handle exception
        }
    }
    public void processDirectoryTree(File root) throws IOException {
        for(File file: Directory.walk(root.getAbsolutePath(), ".*\\."+ext)) {
            // 执行回调函数
            strategy.process(file.getCanonicalFile());
        }
    }
    public static void main(String[] args) {
        new ProcessFiles(new ProcessFiles.Strategy() {
            // 回调函数
            public void process(File file) {
                System.out.println(file);
            }
        }, "java").start(args);;
    }
}
/* Output: (sample)
E:\\javaBaseLearn\\IOStream\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\Directory.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\DirList.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\DirList2.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\DirList3.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\PPrint.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\ProcessFiles.java
E:\\javaBaseLearn\\IOStream\\workSpace\\java-io-stream\\src\\com\\zachary\\io\\util\\TreeInfo.java
*///:~

4.目录的检查及创建

package com.zachary.file;

import java.io.File;
import java.io.IOException;

/**
 * @author Zachary.Zheng
 * @version 1.0
 * @date 2019年11月10日
 */
public class MakeDirectories {
    private static void usage() {
        System.err.println(
            "Usage:MakeDirectories path1 ...\n" +
            "Creates each path\n" +
            "Usage:MakeDirectories -d path1 ...\n" +
            "Creates each path\n" +
            "Usage:MakeDirectories -r path1 path2\n" +
            "Renames from path1 to path2" );
        System.exit(1);
    }
    private static void fileData(File f) {
        System.out.println(
                "Absolute path: " + f.getAbsolutePath() +
                "\n Can read: " + f.canRead() +
                "\n Can write: " + f.canWrite() +
                "\n getName: " + f.getName() +
                "\n getParent: " + f.getParent() +
                "\n getPath: " + f.getPath() +
                "\n length: " + f.length() +
                "\n lastModified: " + f.lastModified() );
        if(f.isFile()) {
            System.out.println("It‘s a file");
        } else if(f.isDirectory()) {
            System.out.println("It‘s s directory");
        }
    }
    public static void main(String[] args) throws IOException {
        if(args.length < 1) {
            usage();
        }
        // 读
        if(args[0].equals("-r")) {
            if(args.length != 3) {
                usage();
            }
            File
                old = new File(args[1]),
                rename = new File(args[2]);
            // 重新命名 成功返回true 失败返回false
            System.out.println("renameTo: "+old.renameTo(rename));
            fileData(old);
            fileData(rename);
            return; // Exit main
        }
        // add 文件
        // -add MakeDirectoriesTest MakeDirectoriesTest.txt
        if(args[0].equals("-add")) {
            if(args.length != 3) {
                usage();
            }
            File f = new File(args[1], args[2]);
            if(!f.exists()) {
                // 创建文件 MakeDirectoriesTest.txt
                f.createNewFile();
                System.out.println("created..." + f);
            }
            return; // Exit main
        }
        int count = 0;
        boolean del = false;
        if(args[0].equals("-d")) {
            count++;
            del = true;
        }
        count--;
        while (++count < args.length) {
            File f = new File(args[count]);
            if(f.exists()) {
                System.out.println(f + "exists");
                if(del) {
                    System.out.println("deleting..." + f);
                    f.delete();
                }
            } else { // 文件不存在
                if(!del) {
                    f.mkdirs();
                    System.out.println("created..." + f);
                }
            }
            fileData(f);
        }
    }
}

原文地址:https://www.cnblogs.com/zhongli1/p/11832023.html

时间: 2024-11-10 03:04:48

目录实用工具的相关文章

VDLink | Win7 目录联接工具

分类: 系统增强    版本: 0.0.1    发布日期: 2015-11-02 一款简洁实用的 Win7 目录联接工具. 功能简介 集成到资源管理器右键弹出菜单 支持任意目录内创建目录联接 支持创建当前选定目录的联接到任意位置 下载 下载地址1    下载地址2(提取码: bd12)

十大好用的Linux实用工具推荐

这 10 个 Linux 工具可以帮助大家提高工作和使用效率,非常实用. 1.w 对,你没看错,就是 w 命令.使用该命令我们可以查看到当前登录系统的用户是谁,以及执行了哪些命令. 2.nmon Nmon 是一个可以监控当前系统性能的小工具,使用之前需要先用如下命令进行安装: sudo apt-get install nmon 安装好后执行 nmon 命令即可打开: nmon nmon 可以查看网络.CPU.内存和磁盘的使用情况. 打开之后按 c 查看 CPU 信息: 打开之后按 n 查看网络信

ServiceModel 元数据实用工具 (Svcutil.exe)

ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档 一.SvcUtil.exe ServiceModel 元数据实用工具可在 Windows SDK 安装位置中找到,具体位置为 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin 功能 下表概括了此工具提供的各种功能,以及论述如何使用该工具的对应主题. 任务 主题 依据运行的服务或静态元数据文档生成代码 根据服务元数据生成 WCF 客户端 从

[Linux实用工具]munin-node插件配置和插件编写

前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx) 这次介绍一下munin-node的插件的安装配置和插件的编写. 插件配置 munin-node本身就集成了很多的插件,只需要直接建个软链就可以了.像Nginx.Apach.mysql都是有现成的插件可以使用的. munin的插件默认保存在/etc/munin/plugins里面.进去查看会发现很多软链,软链到/usr/s

[Linux实用工具]Linux监控工具munin的展示(Nginx)

Munin的安装和配置可以参考第一篇文章: [Linux实用工具]Linux监控工具munin的安装和配置 http://www.cnblogs.com/rond/p/3757804.html Munin的结果是用html展示的.所以展示结果非常简单,只需要部署一个web服务器就可以了.但是如果你需要细看展示结果的话,就需要配置下了. 本篇文章分成2部分说明: 1. web服务器展示监控结果(nginx): 2. 动态展示静态munin的结果. //-----------------------

微软宣布正式废除SQLIO实用工具

SQLIO实用工具已经过时,因为已知的一些BUG使得对于性能调优来说不靠谱.SQL Server开发者研究了SQLIO实用工具的使用模型,决定用DiskSpd替代它. DiskSpd是一个开源实用工具,由Windows开发组提供,设计现代并容易扩展. DiskSpd的下载链接和使用说明:https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223 SQLIO 被废弃:测试性能指标.优化I/O SQLIOSIM 无改

Android 提功的文件管理实用工具

deleteFile()  删除由当前应用程序所创建的文件 fileList() 返回应用程序所创建的文件数组 这两个方法清除遗留的临时文件非常有用 -----------------------------------分割线---------------------------------------- getDir() getExternalFilesDir(),此方法是API8(Android2.2中引入的)如果适应早期平台使用.Enviroment.getExternalStorageD

【转】十款让 Web 前端开发人员更轻松的实用工具

这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具,所以如果下面这些工具对于你来说都是新的领域,那么这篇文章是非常有用的,因为这些实用的工具将让你的工作更有效率. Spritepad 借助 SpritePad,你可以在几分钟甚至几秒钟内创建你的 CSS 精灵.只需拖放您的图片,立即可以生成 PNG 精灵图片以及 CSS 代码.不需要在 Photosh

iPhone配置实用工具介绍

苹果提供了iTunes工具给我们操作iOS设备上的内容,可以安装应用.同步照片.音乐等等.不过iTunes使用比较麻烦,不太方便,第三方的iTools等工具是我们比较常用的.不过对iOS应用开发者来说,我们常常需要发布Adhoc版本,这些版本只能装在指定的一些设备里面,和通过AppStore发布的应用是不一样的,有时会发生iTunes/iTools死活安装不上应用的情况. 这里要介绍的iPhone配置实用工具也是苹果官方推出的一个简单的设备管理工具,它主要用于管理设备的应用与Provision