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 即可下载。

commons-io-2.6-bin.tar.gz md5 pgp
commons-io-2.6-bin.zip md5 pgp

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



    commons-io
    commons-io
    2.6

FileUtils 常用 API 汇总

方法 描述
write(File file, CharSequence data)

将指定数据(data)写入到指定的文件(file)中。file必须是文件,是目录时抛异常.

file整个路径可以不存在,即使父目录不再,不再时也会自动全部新建。这种方式写入时,如果文件已经存在了,则先删除之前的内容,然后在重新写入,即完全覆盖,而不是内容追加。

write(File file, CharSequence data, boolean append)

append 表示是否内容追加,true时为内容追加,false时与上面的write(File file, CharSequence data)一样.

write(File file, CharSequence data, Charset encoding) encoding可以指定文件内容编码,这在网络通信时防止中文乱码非常有用。默认覆盖旧内容。
write(final File file, final CharSequence data, final Charset encoding, final boolean append) 指定编码的同时,指定是否能够覆盖旧内容。
String readFileToString(final File file, final String encoding) 读取整个文件转为字符串,并指定编码。
String readFileToString(final File file, final Charset encoding) 读取整个文件转为字符串,并指定编码。
String readFileToString(final File file) 读取整个文件转为字符串,使用默认编码。
long sizeOf(final File file) 可以统计文件大小,也可以统计目录大小,单位为 字节.如果文件或者目录不存在,则报错
String byteCountToDisplaySize(final long size) 将文件字节数转为可视化的 KB、MB、GB 等形式的字符串,一共有:bytes、KB、MB、GB、TB、PB、EB.如果文件或者目录不存在,则报错
long sizeOfDirectory(final File directory) 统计目录的大小,单位为 字节.只统计目录的大小,如果是文件则报错
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}\r\n";
        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 listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
Collection listFiles(final File directory, final String[] extensions, final boolean recursive)

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

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

1)directory:被遍历的目录,必须是已经存在的目录,否则报错
2)fileFilter:文件过滤器,IOFileFilter 是一个接口,常用的实现类有:SuffixFileFilter(文件后缀过滤器)、PrefixFileFilter(文件前缀过滤器)、TrueFileFilter(总是返回true的文件过滤器)、FalseFileFilter(总是返回false的文件过滤器)
3)dirFilter:与上面同理
4)extensions:如果为 null ,则底层用的是 TrueFileFilter.INSTANCE,否则用的是 new SuffixFileFilter(suffixes)
5)recursive:如果为 true,则底层用的是 TrueFileFilter.INSTANCE,否则 false 时 用 FalseFileFilter.INSTANCE
6)如下所示为 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 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 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[] 等
             *      3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
             *
             * 第三个参数 目录过滤
             *      TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
             *      FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
             */
            Collection 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[] 等
             *      3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
             *
             * 第三个参数 目录过滤
             *      TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
             *      FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
             */
            Collection 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 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 fileCollection = FileUtils.listFiles(targetDir, sizeFileFilter, TrueFileFilter.INSTANCE);
            for (File file : fileCollection) {
                System.out.println(">>> " + file.getPath() + "\t" + file.length() +
                        "\t" + FileUtils.byteCountToDisplaySize(file.length()));
            }
        }
    }
}

 

你可能感兴趣的:(IO_File_utils,Apache)