1. 程式人生 > 實用技巧 >io-File類

io-File類

File類

概述

java.io.File 類是檔案和目錄路徑名的抽象表示,主要用於檔案和目錄的建立、查詢和刪除等操作

java把電腦中的檔案和資料夾(目錄)封裝為了一個 File 類 ,我們可以使用 File 類對檔案和資料夾進行操作

我們可以使用 File 類的方法

  • 建立一個檔案 / 資料夾
  • 刪除檔案 / 資料夾
  • 獲取檔案 / 資料夾
  • 判斷檔案 / 資料夾是否存在
  • 對資料夾進行遍歷
  • 獲取檔案的大小

File 類是一個與系統無關的類,任何的作業系統都可以使用這個類中的方法

重點:記住這三個單詞

  • file:檔案
  • directory:資料夾/目錄
  • path:路徑

靜態成員變數

  • static String pathSeparator
    • 與系統有關的路徑分隔符,為了方便,它被表示為一個字串
  • static char pathSeparatorChar
    • 與系統有關的路徑分隔符
  • static String separator
    • 與系統有關的預設名稱分隔符,為了方便,它被表示為一個字串
  • static char separatorchar
    • 與系統有關的預設名稱分隔符

不同系統中,路徑分隔符,名稱分隔符的表示是不一樣的

  • 比如:
    • 路徑分隔符:windows:分號; linux:冒號:
    • 檔名稱分隔符:windows:反斜槓\ linux:正斜槓/
  • 因此在今後日常的開發中,不建議將檔案 / 資料夾的操作路徑寫死

路徑

絕對路徑

絕對路徑是一個完整的路徑,以碟符(c:,D:)開始的路徑

相對路徑

相對路徑是一個簡化的路徑,相對指的是相對於當前專案的根目錄
如果使用當前專案的根目錄,路徑可以簡化書寫,可以省略專案的根目錄

注意

  • 路徑是不區分大小寫
  • 路徑中的檔名稱分隔符
    • Windows使用反斜槓,但是反斜槓是轉義字元,所以要用兩個反斜槓代表一個普通的反斜槓

構造方法

  • public File(String pathname);
    • 通過將給定的路徑名字串轉換為抽象路徑名來建立新的 Flle 例項
    • 引數:
      • String pathname:字串型別的路徑名稱
      • 路徑可以是以檔案結尾,也可以是以資料夾結尾
      • 路徑可以是相對路徑,也可以是絕對路徑
      • 路徑可以是存在,也可以是不存在
      • 建立 File 物件,只是把字串路徑封裝為 File 物件,不考慮路徑的真假情況
  • public File(String parent, String child);
    • 從父路徑名字串和子路徑名字串建立新的 Flle 例項
    • 引數:
      • 把路徑分成了兩部分
      • String parent:父路徑
      • String child:子路徑
    • 好處:
      • 父路徑和子路徑可以單獨書寫,使用起來非常靈活
      • 父路徑和子路徑都可以變化
  • public File(File parent, string child);
    • 從父抽象路徑名和子路徑名字串建立新的 File 例項
    • 引數:
      • 把路徑分成了兩部分
      • FiLe parent:父路徑
      • String child:子路徑
    • 好處:
      • 父路徑和子路徑可以單獨書寫,使用起來非常靈活
      • 父路徑和子路徑都可以變化
      • 父路徑是 File 型別,可以使用 File 的方法對路徑進行一些操作,再使用路徑建立物件

常用方法

獲取功能的方法

  • public string getAbsolutePath();

    • 返回此 File 的絕對路徑名字串
    • 獲取的構造方法中傳遞的路徑
    • 無論路徑是絕對的還是相對的,getAbsolutePath 方法返回的都是【絕對路徑】
  • public string getPath();

    • 將此 File 轉換為路徑名字串

    • File 重寫的 toString 方法呼叫的就是 getPath 方法

      public String tostring() {
      	return getPath();
      }
      
  • public string getName();

    • 返回由此 File 表示的檔案或目錄的名稱
    • 獲取的就是構造方法傳遞路徑的結尾部分(檔案 / 資料夾)
  • public long length()

    • 返回由此 File 表示的檔案的長度
    • 獲取的是構造方法指定的檔案的大小,以位元組為單位
    • 注意:
      • 資料夾是沒有大小概念的,不能獲取資料夾的大小
      • 如果構造方法中給出的路徑不存在,那麼 length 方法返回 0

判斷功能的方法

  • public boolean exists();
    • 此 File 表示的檔案或目錄是否實際存在
  • public boolean isDirectory();
    • 此 File 表示的是否為目錄
    • 用於判斷構造方法中給定的路徑是否以資料夾結尾
  • public boolean isFile();
    • 此 File 表示的是否為檔案
    • 用於判斷構造方法中給定的路徑是否以檔案結尾

注意:

  • 電腦的硬碟中只有檔案 / 資料夾,isDirectory 和 isFile 兩個方法是互斥的
  • isDirectory 和 isFile 兩個方法使用前提:路徑必須是存在的。否則都返回 false

建立刪除功能的方法

  • public boolean createNewFile();
    • 當且僅當具有該名稱的檔案尚不存在時,建立一個新的空檔案
    • 建立檔案的路徑和名稱在構造方法中給出(構造方法的引數)
    • 返回值:布林值
      • true:檔案不存在,建立檔案,返回 true
      • false:檔案存在,不會建立,返回 false
    • 注意:
      • 此方法只能建立檔案,不能建立資料夾
      • 建立檔案的路徑必須存在,否則會丟擲異常
      • createNewFile 方法宣告丟擲了 IOException,當呼叫這個方法時,就必須的處理這個異常,要麼 throws ,要麼 try-catch
  • public boolean delete();
    • 刪除由此 File 表示的檔案或目錄
    • 此方法,可以刪除構造方法路徑中給出的檔案 / 資料夾
    • 返回值:布林值
      • true:檔案 / 資料夾地除成功,返回 true
      • false:
        • 資料夾中有內容,不會刪除返回 false
        • 構造方法中路徑不存在 false
    • 注意:
      • delete 方法是直接在硬碟刪除檔案 / 資料夾,不經過回收站,【刪除要謹慎
  • public boolean mkdir();
    • 建立由此 File 表示的目錄
    • 建立資料夾的路徑和名稱在構造方法中給出(構造方法的引數)
    • 返回值:布林值
      • true:資料夾不存在,建立資料夾,返回 true
      • false:
        • 資料夾存在,不會建立,返回 false
        • 構造方法中給出的路徑不存在返回 false
    • 注意:
      • 此方法只能建立資料夾,不能建立檔案
      • 不會丟擲異常,但路徑不存在,也不會建立
  • public boolean mkdirs();
    • 建立由此 File 表示的目錄,包括任何必需但不存在的父目錄
    • 既可以建立單級空資料夾,也可以建立多級資料夾

目錄的遍歷

  • public String[] list();
    • 返回一個 String 陣列,表示該 File 目錄中的所有子檔案或目錄
    • 遍歷構造方法中給出的目錄,獲取目錄中所有檔案 / 資料夾的名稱,把獲取到的多個名稱儲存到一個 String 型別的陣列中
  • public File[] listFiles();
    • 返回一個 File 陣列,表示該 File 目錄中的所有的子檔案或目錄
    • 遍歷構造方法中給出的目錄,獲取目錄中所有的檔案 / 資料夾,把檔案 / 資料夾封裝為 File 物件,再把多個 File 物件儲存到 File 陣列中

注意:

  • list 方法和 listFiles 方法遍歷的是構造方法中給出的目錄
  • list 方法和 listFiles 方法會獲取目錄中的所有檔案,包括隱藏檔案
  • 如果構造方法中給出的目錄的路徑不存在,會丟擲空指標異常
  • 如果構造方法中給出的路徑不是一個目錄,也會丟擲空指標異常

檔案過濾器

在 File 類中有兩個和 listFiles 過載的方法,方法的引數傳遞的就是過濾器

  • public File[] listFiles(FileFilter filter);
    • listFiles 方法一共做了三件事情:
      • listFiles 方法會對構造方法中傳遞的目錄進行追歷,獲取目錄中的每一個 檔案 / 資料夾,封裝為 File 物件
      • listFiles 方法會呼叫引數傳遞的過濾器中的 accept 方法
      • listFiles 方法會把遍歷得到的每一個 File 物件傳遞過 accept 方法的引數 pathname

FileFilter

  • java.io. FileFilter 介面:用於抽象路徑名(File 物件)的過濾器

  • 作用:用來過濾檔案(File物件)

具有一個抽象方法:用來過濾檔案的方法

  • boolean accept(File pathname);

    • 測試指定抽象路徑名是否應該包含在某個路徑名列表中。
    • 引數:
      • File pathname:使用 listFiles 方法遍歷目錄,得到的每一個檔案物件
    • 返回值:
      • accept 方法返回值是一個布林值
      • true:就會把傳遞過去的 File 物件儲存到 File 陣列中
      • false:就不會把傳遞過去的 File 物件儲存到 File 陣列中
  • public FiLe[] listFiles(FilenameFilter filter);

FilenameFilter

  • java.io.FilenameFilter 介面:實現此介面的類例項可用於過濾器檔名
  • 作用:用於過濾檔名稱

具有一個抽象方法:用來過濾檔案的方法

  • boolean accept(File dir, String name);
    • 測試指定檔案是否應該包含在某一檔案列表中
    • 引數:
      • File dir:構造方法中傳遞的被遍歷的目錄
      • String name:使用 listFiles 方法遍歷目錄,獲取的每一個檔案 / 資料夾的名稱

注意

  • 兩個過濾器介面都是沒有實現類的,需要我們自己寫實現類,重寫過濾的 accept 方法,在方法中自己定義過濾的規則
  • 使用過濾器必須明確兩件事情:
    • 過濾器中的 accept 方法是誰呼叫的
    • accept 方法的引數 pathname 是什麼
  • 兩個過濾器介面都是函式式介面,可以簡化適用 Lambda 表示式