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}\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<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() + "\t" + file.length() +
                        "\t" + FileUtils.byteCountToDisplaySize(file.length()));
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM