zoukankan      html  css  js  c++  java
  • Apache Commons io FileUtils 详解

    目录

    FileUtils 常用 API 汇总

    listFiles 方法遍历目录/文件

    序言

    1、Apache 为大家提供了很多有用的 API,如 StringUtils、FileUtis 就是其中常用的之一

    2、FileUtils 主要用于操作文件, API 所在包为:org.apache.commons.io

    3、所需开发包可从官网下载:http://commons.apache.org/proper/commons-io/

    4、直接点击  commons-io-2.6-bin.zip 即可下载。

    5、Maven 仓库获取地址:http://mvnrepository.com/artifact/commons-io/commons-io

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

    FileUtils 常用 API 汇总

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.lang3.time.DateFormatUtils;
    import org.junit.Test;
    import java.io.File;
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.util.Date;
    public class Test2 {
        @Test
        public void test1() throws IOException {
            String FilePath = "E:\xfmovie1\a.txt";//当E盘下xfmovie1不存在时,自动新建
            String context = "{"name":"BeJson帅","url":"http://www.bejson.com"page":88,"isNonProfit":true}";
            FileUtils.write(new File(FilePath), context);
        }
        @Test
        public void test2() throws IOException {
            String FilePath = "E:\xfmovie1\a.txt";
            String context = "{"name":"BeJson帅","url":"http://www.bejson.com"page":88,"isNonProfit":true}
    ";
            FileUtils.write(new File(FilePath), context, true);//内容追加,而不再是覆盖
        }
        @Test
        public void test3() throws IOException {
            File file1 = new File("E:\wmx\searchsource\1.create web page.txt");
            File file2 = new File("E:\wmx\searchsource");
            /**sizeOf 方法即可以统计文件,也可以统计目录,底层使用:
             * return file.isDirectory()?sizeOfDirectory(file):file.length();*/
            Long size = FileUtils.sizeOf(file1);
     
            /**byteCountToDisplaySize:将文件字节数转为可视化的 KB、MB、GB 等形式的字符串
             * 一共有:bytes、KB、MB、GB、TB、PB、EB*/
            String sizeShow = FileUtils.byteCountToDisplaySize(size);
            System.out.println(file1.getName() + " 文件大小为:" + size + " 字节," + sizeShow);
     
            Long size2 = FileUtils.sizeOf(file2);
            String size2Show = FileUtils.byteCountToDisplaySize(size2);
            System.out.println(file2.getName() + " 目录大小为:" + size2 + " 字节," + size2Show);
     
            File file3 = new File("E:\wmx\searchsource");
            /** sizeOfDirectory:只统计目录的大小,如果是文件则报错
             * 目录不存在时报错*/
            Long file3Size = FileUtils.sizeOfDirectory(file3);
            String file3SizeShow = FileUtils.byteCountToDisplaySize(file3Size);
            System.out.println("目录 " + file2.getName() + " 大小为:" + file3Size + " 字节," + file3SizeShow);
        }
     
        /**
         * 在指定目录下生成文件,并写入内容
         *
         * @param dir:指定的目录
         * @param fileName:待生成的文件,包含名称与格式,如:23.docx;缺省时,采用
         * @param context:文件待写入的内容,覆盖旧内容。
         * @return 写入成功时,返回true,否则返回false
         */
        public static final boolean createFile(String dir, String fileName, String context) {
            boolean result = false;
            try {
                if (StringUtils.isBlank(fileName)) {
                    String dateStr = DateFormatUtils.format(new Date(), "yyyy_MM_dd_HH_mm_ss");
                    fileName = "act_" + dateStr + ".json";
                }
                if (StringUtils.isNotBlank(dir) && StringUtils.isNotBlank(context)) {
                    File file = new File(new File(dir), fileName);
                    /**为了为防止context在远程客户端使用HttpClient传输时乱码,对方采用UTF-8发送,这里写入时也采用UTF-8*/
                    FileUtils.write(file, context, Charset.forName("UTF-8"));
                    result = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
     
        /**
         * 读取本地文件文本内容
         *
         * @param file :待读取的文件
         * @return :返回读取的文本内容
         */
        public static String readLocalFile(File file) {
            String feedback = "";
            try {
                if (file.exists() && file.isFile()) {
                    // 一共重载了3个方法:
                    // readFileToString(File file) :以默认编码读取文件内容
                    // readFileToString(File file, String encoding)
                    // readFileToString(File file, Charset encoding)
                    feedback = FileUtils.readFileToString(file, "gbk");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return feedback;
        }
    }

    listFiles 方法遍历目录/文件

    Collection<File> listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
    Collection<File> listFiles(final File directory, final String[] extensions, final boolean recursive)

    1、listFiles 方法用于迭代遍历获取指定目录下的所有文件,包含子孙目录。

    2、listFiles 方法能在遍历获取的时候进行过滤,比如只获取文件名以 某某开头的,或者获取文件名以某某结尾的,或者是文件大小大于等于某某 的等等。

    • directory:被遍历的目录,必须是已经存在的目录,否则报错
    • fileFilter:文件过滤器,IOFileFilter 是一个接口,常用的实现类有:SuffixFileFilter(文件后缀过滤器)、PrefixFileFilter(文件前缀过滤器)、TrueFileFilter(总是返回true的文件过滤器)、FalseFileFilter(总是返回false的文件过滤器)
    • dirFilter:与上面同理
    • extensions:如果为 null ,则底层用的是 TrueFileFilter.INSTANCE,否则用的是 new SuffixFileFilter(suffixes)
    • recursive:如果为 true,则底层用的是 TrueFileFilter.INSTANCE,否则 false 时 用 FalseFileFilter.INSTANCE
    • 如下所示为 listFiles(  final File directory, final String[] extensions, final boolean recursive) 的源码:
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.filefilter.PrefixFileFilter;
    import org.apache.commons.io.filefilter.SizeFileFilter;
    import org.apache.commons.io.filefilter.SuffixFileFilter;
    import org.apache.commons.io.filefilter.TrueFileFilter;
    import java.io.File;
    import java.util.Collection;
    /**
     * Created by Administrator on 2018/8/30 0030.
     * 自定义文件工具类
     */
    public class FileWmxUtils {
        public static void main(String[] args) {
            File fileDir = new File("E:\gxg\resources\docs");
            /**查询目标目录下 文件大小 为 5KB 及以上的文件*/
            loopDir6(fileDir, 5 * 1024L, true);
        }
        /**
         * 遍历目录下的所有文件--方式1
         *
         * @param targetDir
         */
        public static void loopDir1(File targetDir) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                /**
                 * targetDir:不要为 null、不要是文件、不要不存在
                 * 第二个 文件过滤 参数如果为 FalseFileFilter.FALSE ,则不会查询任何文件
                 * 第三个 目录过滤 参数如果为 FalseFileFilter.FALSE , 则只获取目标文件夹下的一级文件,而不会迭代获取子文件夹下的文件
                 */
                Collection<File> fileCollection = FileUtils.listFiles(targetDir,
                        TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath());
                }
            }
        }
        /**
         * 遍历目录下的所有文件--方式2
         *
         * @param targetDir
         */
        public static void loopDir2(File targetDir) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                /**
                 * targetDir:不要为 null、不要是文件、不要不存在
                 * 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
                 * 第三个 目录过滤 参数为 true 时,底层就是  recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
                 */
                Collection<File> fileCollection = FileUtils.listFiles(targetDir, null, true);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath());
                }
            }
        }
        /**
         * 遍历目录下所有以指定字符开头的文件----方式1
         *
         * @param targetDir 不要为 null、不要是文件、不要不存在
         * @param prefixs   文件前缀,支持多个,当为 null 时,表示不过滤
         */
        public static void loopDir3(File targetDir, String[] prefixs) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                PrefixFileFilter prefixFileFilter = null;
                if (prefixs != null) {
                    prefixFileFilter = new PrefixFileFilter(prefixs);
                } else {
                    prefixFileFilter = new PrefixFileFilter("");
                }
                /**
                 * targetDir:不要为 null、不要是文件、不要不存在
                 * 第二个参数 文件过滤
                 *      1)PrefixFileFilter:为文件名前缀过滤器
                 *      2)PrefixFileFilter 构造器参数可以是 String、List<String>、String[] 等
                 *      3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
                 *
                 * 第三个参数 目录过滤
                 *      TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
                 *      FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
                 */
                Collection<File> fileCollection = FileUtils.listFiles(targetDir, prefixFileFilter, TrueFileFilter.INSTANCE);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath());
                }
            }
        }
        /**
         * 遍历目录下所有以指定字符结尾的文件----方式1
         *
         * @param targetDir 不要为 null、不要是文件、不要不存在
         * @param suffixs   文件后缀,支持多个,当为 null 时,表示不过滤
         */
        public static void loopDir4(File targetDir, String[] suffixs) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                /**
                 * SuffixFileFilter 指定的后缀可以是任意字符,如文件 overview-tree.html,后缀过滤器字符 html、.html、tree.html 等都能匹配
                 * */
                SuffixFileFilter suffixFileFilter = null;
                if (suffixs != null) {
                    suffixFileFilter = new SuffixFileFilter(suffixs);
                } else {
                    suffixFileFilter = new SuffixFileFilter("");
                }
                /**
                 * targetDir:不要为 null、不要是文件、不要不存在
                 * 第二个参数 文件过滤
                 *      1)SuffixFileFilter:为文件名后缀过滤器
                 *      2)SuffixFileFilter 构造器参数可以是 String、List<String>、String[] 等
                 *      3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
                 *
                 * 第三个参数 目录过滤
                 *      TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
                 *      FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
                 */
                Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixFileFilter, TrueFileFilter.INSTANCE);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath());
                }
            }
        }
        /**
         * 遍历目录下所有指定后缀名结尾的文件----方式2
         *
         * @param targetDir :不要为 null、不要是文件、不要不存在
         * @param suffixs   :与 SuffixFileFilter 不同 ,此时只能是文件后缀名;如 文件 overview-tree.html,suffixs 为 html 才能匹配上,.html 则不能匹配
         *                  因为 listFiles 底层自动加了 "."
         */
        public static void loopDir5(File targetDir, String[] suffixs) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                /**
                 * targetDir:不要为 null、不要是文件、不要不存在
                 * 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
                 * 第三个 目录过滤 参数为 true 时,底层就是  recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
                 */
                Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixs, true);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath());
                }
            }
        }
        /**
         * 遍历目录下所有大于或者小于指定大小的文件
         *
         * @param targetDir    不要为 null、不要是文件、不要不存在
         * @param fileSize     文件判断大小,单位 字节
         * @param acceptLarger 为 true,则表示获取  大于等于 fileSize 的文件
         *                     为 false ,则表示获取 小于 fileSize 的文件
         */
        public static void loopDir6(File targetDir, Long fileSize, boolean acceptLarger) {
            if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
                /**
                 * SizeFileFilter(final long size, final boolean acceptLarger)
                 * 1)文件大小过滤器
                 * 2)size,表示判断的依据点
                 * 3)acceptLarger:为 true,则表示获取  大于等于 size 的文件
                 *      为 false ,则表示获取 小于 size 的文件
                 * 4)单位是字节
                 */
                SizeFileFilter sizeFileFilter = new SizeFileFilter(fileSize, acceptLarger);
                Collection<File> fileCollection = FileUtils.listFiles(targetDir, sizeFileFilter, TrueFileFilter.INSTANCE);
                for (File file : fileCollection) {
                    System.out.println(">>> " + file.getPath() + "	" + file.length() +
                            "	" + FileUtils.byteCountToDisplaySize(file.length()));
                }
            }
        }
    }
  • 相关阅读:
    Selenium webdriver+Java-------如何等待页面元素加载完成
    Jmeter入门实战(二)如何使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比
    Selenium2+Python--下拉选择用select
    Pycharm连接github
    Selenium2+Python--常用方法分类
    setUp和tearDown及setUpClass和tearDownClass的用法及区别
    Selenium2+Python--常用方法
    Selenium2+Python--操作Excel读写(使用xlrd模块实现)
    HashMap 重新认知
    想测试工具类执行main方法却被告知application没有加载怎么办
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13986357.html
Copyright © 2011-2022 走看看