學習File類,並教你寫FileUtil

寫在前面的話

程序包括代碼、數據、文檔。在當今,數據對咱們來講,尤其重要。或存數據庫或寫入文件。這樣對於File類的學習,就顯得十分必要。java

編碼

一、用什麼編碼寫,就用什麼編碼讀git

二、掌握一些讀取文件時可使用編碼方法github

public byte[] getBytes(String charsetName)
            throws UnsupportedEncodingException {
        if (charsetName == null) throw new NullPointerException();
        return StringCoding.encode(charsetName, value, 0, value.length);
    }
public String(byte bytes[], String charsetName)
            throws UnsupportedEncodingException {
        this(bytes, 0, bytes.length, charsetName);
    }

三、GBK、UTF-八、UTF-16BE數據庫

GBK(gbk) 中文2個字節,英文1個字節數組

UTF-8 (utf-8)中文3個字節,英文1個字節學習

UTF-16BE(utf-16be)Java雙字節編碼,中/英文 都佔用2個字節測試

英文中文的問題,在實際開發中,編碼是避免不了的this

File API

一、類結構編碼

  • java.lang.Object
    • java.io.File

二、構造方法spa

從父抽象路徑名和子路徑名字符串建立新的 File實例。 File(File parent, String child)

經過將給定的路徑名字符串轉換爲抽象路徑名來建立新的 File實例。
File(String pathname)

從父路徑名字符串和子路徑名字符串建立新的 File實例。 File(String parent, String child)

三、經常使用API

當咱們拿到一個file對象,你首先想到它是否存在

boolean exists() 
測試此抽象路徑名錶示的文件或目錄是否存在。

不存在,你能夠去建立

boolean mkdir() 
建立由此抽象路徑名命名的目錄。  

boolean mkdirs() 
建立由此抽象路徑名命名的目錄,包括任何須需但不存在的父目錄。  

boolean createNewFile() 
當且僅當具備該名稱的文件尚不存在時,原子地建立一個由該抽象路徑名命名的新的空文件。

若是存在的話,你可能有刪除的需求

boolean delete() 
刪除由此抽象路徑名錶示的文件或目錄。

固然,你也能夠獲取相關的屬性

String getName() 
返回由此抽象路徑名錶示的文件或目錄的名稱。  

String getAbsolutePath() 
返回此抽象路徑名的絕對路徑名字符串。  

String getParent() 
返回此抽象路徑名的父 null的路徑名字符串,若是此路徑名未命名爲父目錄,則返回null。

若是是一個目錄,你可能想知道它下面有哪些子目錄

String[] list() 
返回一個字符串數組,命名由此抽象路徑名錶示的目錄中的文件和目錄。  

File[] listFiles() 
返回一個抽象路徑名數組,表示由該抽象路徑名錶示的目錄中的文件。

FileUtil

咱們想列出一個目錄下全部的文件,咱們來試一下

/**
 * 查找一個目錄下全部的文件
 * @param dir 目錄
 * @throws IllegalArgumentException 目錄不存在,或者不是目錄
 */
public static void findAllFile (File dir) throws IllegalArgumentException {
    if (!dir.exists()) {
        throw new IllegalArgumentException("目錄:" + dir + " 不存在");
    }
    if (!dir.isDirectory()) {
        throw new IllegalArgumentException(dir + " 不是目錄");
    }
    File[] files = dir.listFiles(); // 返回的是直接子目錄(文件)對象
    if (files != null && files.length > 0) {
        for (File file : files) {
            if (file.isDirectory()) {
                // 遞歸查詢字目錄
                listDirectory(file);
            } else {
                System.out.println(file);
            }
        }
    }
}

寫一下測試代碼:

FileUtil.findAllFile(new File("E:\\Workspace\\IdeaStudio\\io-demo"));

測試結果:

列出目錄下全部的文件-測試結果-1.png

沒有問題吧

注意看,這裏用了遞歸的方式,這不是很好。另外,咱們須要返回值,那應該怎麼寫呢?咱們來試一下:

/**
 * 查找一個目錄下全部的文件
 * @param dir 目錄
 * @return list文件集合
 * @throws IllegalArgumentException 目錄不存在,或者不是目錄
 */
public static List<File> findAllFile2 (File dir) throws IllegalArgumentException {
    if (!dir.exists()) {
        throw new IllegalArgumentException("目錄:" + dir + " 不存在");
    }
    if (!dir.isDirectory()) {
        throw new IllegalArgumentException(dir + " 不是目錄");
    }
    File[] files = dir.listFiles(); // 返回的是直接子目錄(文件)對象

    // 全部文件
    List<File> fileList = new ArrayList<>();

    // 目錄
    LinkedList<File> dirs = new LinkedList<>();
    if (files != null && files.length > 0) {
        for (File file : files) {
            if (file.isDirectory()) {
                dirs.add(file);
            } else {
                fileList.add(file);
            }
        }
    }

    File fileTmp;

    while (!dirs.isEmpty()) {
        fileTmp = dirs.removeFirst(); // 獲取第一個目錄
        files = fileTmp.listFiles(); // 該目錄下全部的文件
        if (files != null && files.length > 0) {
            for (File file : files) {
                if (file.isDirectory()) {
                    dirs.add(file);
                } else {
                    fileList.add(file);
                }
            }
        }
    }

    return fileList;
}

測試代碼:

List<File> fileList = FileUtil.findAllFile2(new File("E:\\Workspace\\IdeaStudio\\io-demo"));
for (File file : fileList) {
    System.out.println(file);
}

測試結果:

列出目錄下全部的文件-測試結果-2.png

別人都說非遞歸比遞歸好,我就不信了,遞歸代碼多簡單啊

來測試一下(時間毫秒):

遞歸 vs 非遞歸

看來,沒有騙我。

資料

一、本節測試代碼:file

二、文件傳輸基礎——Java IO流

三、Java中的LinkedList的方法的應用

相關文章
相關標籤/搜索