1. 程式人生 > >File類檔案操作全解

File類檔案操作全解

Java使用File類對檔案進行操作。在很多教程中,我們會同時學到File類和類似FileInputStream這樣的流,非常容易將兩者混淆。實際上只要掌握了他們的工作原理就不難理解,File類以操作檔案的屬性和狀態為主,而IO流以在兩個客戶端之間傳輸資料為主。雖然同是操作檔案但出發點是不同的。File類很簡單,我們通過實際的例子來學習它的常用API方法。

File類規則約定

當程式接觸到底層的作業系統時,一些細小而繁雜的事引起了File類開發者的注意。
他們為了避免將問題複雜化,採用了下面四種約定將JAVA和檔案系統在一定程度上良好的結合。

路徑名約定

  1. 對於 UNIX 平臺,絕對路徑名的字首始終是 “/”。相對路徑名沒有字首。表示根目錄的絕對路徑名的字首為 “/” 且名稱序列為空。
  2. 對於Microsoft Windows 平臺,包含碟符的路徑名字首由驅動器號和一個 “:” 組成。如果路徑名是絕對路徑名,還可能後跟“\”。UNC 路徑名的字首是 “\\”;主機名和共享名是名稱序列中的前兩個名稱。沒有指定驅動器的相對路徑名沒有字首。

通常,我們在使用windows作業系統下,可以採用”\”或”/”來表示路徑的分隔符,反斜槓需要寫兩個為了表示轉義的意思。

分割槽約定

此類的例項可能表示(也可能不表示)實際檔案系統物件,如檔案或目錄。如果它表示這種物件,那麼該物件駐留在一個分割槽 中。分割槽是檔案系統特定於作業系統的儲存分割槽。一個儲存裝置(例如,物理磁碟驅動器、快閃記憶體、CD-ROM)可以包含多個分割槽。物件(如果有)將駐留在此路徑名(絕對形式)某個祖先指定的分割槽上。

許可權約定

檔案系統可以實現對實際檔案系統物件上的某些操作(比如,讀、寫、執行)進行限制。這些限制統稱為訪問許可權。檔案系統可以對一個物件設定多個訪問許可權。例如,一個設定可能適用於物件的所有者,另一個設定則可能適用於所有其他使用者。物件上的訪問許可權可能導致此類的某些方法執行失敗。

不可變約定

File 類的例項是不可變的;也就是說,一旦建立,File 物件表示的抽象路徑名將永不改變。

構造器方法

    //1
    File f1 =new File("c:\\a\\b.txt");
    //2
    File f2 =new File("c:\\a","c.txt"
); //3 File f3 =new File("c:"+File.separator+"abc"); File f4 =new File(f3,"3.txt");

File類構造方法有4種,其中3種比較常用。
File.separator是File類的一個欄位separator,在任何平臺中可以充當當前作業系統的檔案分隔符。

建立檔案方法

public boolean createNewFile( ) throws IOException

當且僅當不存在具有此抽象路徑名指定名稱的檔案時,不可分地建立一個新的空檔案。檢查檔案是否存在,若不存在則建立該檔案,這是單個操作,對於其他所有可能影響該檔案的檔案系統活動來說,該操作是不可分的。

返回:
如果指定的檔案不存在併成功地建立,則返回 true;如果指定的檔案已經存在,則返回 false

public boolean mkdirs( )

建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。注意,此操作失敗時也可能已經成功地建立了一部分必需的父目錄。

返回:
當且僅當已建立目錄以及所有必需的父目錄時,返回 true;否則返回 false

獲取檔案資訊方法

public File getAbsoluteFile( )

返回此抽象路徑名的絕對路徑名形式。等同於 new File(this.getAbsolutePath())。

返回:
絕對抽象路徑名,它與此抽象路徑名錶示相同的檔案或目錄

public String getName( )

返回由此抽象路徑名錶示的檔案或目錄的名稱。該名稱是路徑名名稱序列中的最後一個名稱。如果路徑名名稱序列為空,則返回空字串。

返回:
此抽象路徑名錶示的檔案或目錄的名稱;如果路徑名的名稱序列為空,則返回空字串

public String getParent( )

返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 null。
抽象路徑名的父 路徑名由路徑名的字首(如果有),以及路徑名名稱序列中最後一個名稱以外的所有名稱組成。如果名稱序列為空,那麼該路徑名沒有指定父目錄。

返回:
此抽象路徑名指定父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 null

public File getParentFile( )

返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。
抽象路徑名的父 路徑名由路徑名的字首(如果有),以及路徑名名稱序列中最後一個名稱以外的所有名稱組成。如果名稱序列為空,那麼該路徑名沒有指定父目錄。

返回:
此抽象路徑名指定父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null

public long length( )

返回由此抽象路徑名錶示的檔案的長度。如果此路徑名錶示一個目錄,則返回值是不確定的。

返回:
此抽象路徑名錶示的檔案的長度,以位元組為單位;如果檔案不存在,則返回 0L。對於表示特定於系統的實體(比如裝置或管道)的路徑名,某些作業系統可能返回 0L。

判斷檔案狀態方法

public boolean isAbsolute( )

測試此抽象路徑名是否為絕對路徑名。絕對路徑名的定義與系統有關。在 UNIX 系統上,如果路徑名的字首是 “/”,那麼該路徑名是絕對路徑名。在 Microsoft Windows 系統上,如果路徑名的字首是後跟 “\” 的碟符,或者是 “\\”,那麼該路徑名是絕對路徑名。

返回:
如果此抽象路徑名是絕對路徑名,則返回 true;否則返回 false

public boolean isDirectory( )

測試此抽象路徑名錶示的檔案是否是一個目錄。

返回:
當且僅當此抽象路徑名錶示的檔案存在且 是一個目錄時,返回 true;否則返回 false

public boolean isFile( )

測試此抽象路徑名錶示的檔案是否是一個標準檔案。如果該檔案不是一個目錄,並且滿足其他與系統有關的標準,那麼該檔案是標準 檔案。由 Java 應用程式建立的所有非目錄檔案一定是標準檔案。

返回:
當且僅當此抽象路徑名錶示的檔案存在且 是一個標準檔案時,返回 true;否則返回 false

public boolean isHidden( )

測試此抽象路徑名指定的檔案是否是一個隱藏檔案。隱藏 的具體定義與系統有關。在 UNIX 系統上,如果檔名以句點字元 (‘.’) 開頭,則認為該檔案被隱藏。在 Microsoft Windows 系統上,如果在檔案系統中檔案被標記為隱藏,則認為該檔案被隱藏。

返回:
當且僅當此抽象路徑名錶示的檔案根據底層平臺約定是隱藏檔案時,返回 true

public boolean canExecute( )

測試應用程式是否可以執行此抽象路徑名錶示的檔案。

返回:
當且僅當抽象路徑名存在且 允許應用程式執行檔案時返回 true。

public boolean canRead( )

測試應用程式是否可以讀取此抽象路徑名錶示的檔案。

返回:
當且僅當此抽象路徑名指定的檔案存在且 可被應用程式讀取時,返回 true;否則返回 false

public boolean canWrite( )

測試應用程式是否可以修改此抽象路徑名錶示的檔案。

返回:
當且僅當檔案系統實際包含此抽象路徑名錶示的檔案且 允許應用程式對該檔案進行寫入時,返回 true;否則返回 false。

public boolean exists( )

測試此抽象路徑名錶示的檔案或目錄是否存在。

返回:
當且僅當此抽象路徑名錶示的檔案或目錄存在時,返回 true;否則返回 false

刪除檔案方法

public boolean delete( )

刪除此抽象路徑名錶示的檔案或目錄。如果此路徑名錶示一個目錄,則該目錄必須為空才能刪除。

返回:
當且僅當成功刪除檔案或目錄時,返回 true;否則返回 false

public void deleteOnExit( )

在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄。 檔案(或目錄)將以與註冊相反的順序刪除。呼叫此方法刪除已註冊為刪除的檔案或目錄無效。根據 Java 語言規範中的定義,只有在虛擬機器正常終止時,才會嘗試執行刪除操作。
一旦請求了刪除操作,就無法取消該請求。所以應小心使用此方法。

操作檔案方法

public File[] listFiles( )

返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中的檔案。
如果此抽象路徑名不表示一個目錄,那麼此方法將返回 null。否則返回一個 File 物件陣列,每個陣列元素對應目錄中的每個檔案或目錄。表示目錄本身及其父目錄的名稱不包括在結果中。得到的每個抽象路徑名都是根據此抽象路徑名,使用 File(File, String) 構造方法構造的。所以,如果此路徑名是絕對路徑名,那麼得到的每個路徑名都是絕對路徑名;如果此路徑名是相對路徑名,那麼得到的每個路徑名都是相對於同一目錄的路徑名。

不保證所得陣列中的相同字串將以特定順序出現,特別是不保證它們按字母順序出現。

返回:
抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中的檔案和目錄。如果目錄為空,那麼陣列也將為空。如果抽象路徑名不表示一個目錄,或者發生 I/O 錯誤,則返回 null。

public String toString( )

返回此抽象路徑名的路徑名字串。該字串就是 getPath() 方法返回的字串。

public String[] list(FilenameFilter filter)返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄。除了返回陣列中的字串必須滿足過濾器外,此方法的行為與 list() 方法相同。如果給定 filter 為 null,則接受所有名稱。否則,當且僅當在此抽象路徑名及其表示的目錄中的檔名或目錄名上呼叫過濾器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 時,該名稱才滿足過濾器。

返回:
字串陣列,這些字串指定此抽象路徑名錶示的目錄中給定 filter 能接受的檔案和目錄。如果目錄為空,或者沒有名稱被過濾器接受,那麼該陣列將為空。如果抽象路徑名不表示一個目錄,或者發生 I/O 錯誤,則返回 null。

public static File[] listRoots( )

列出可用的檔案系統根。
特定 Java 平臺可以支援零個或更多個分層組織的檔案系統。每個檔案系統有一個 root 目錄,可以從這裡到達檔案系統中的所有其他檔案。例如,Windows 平臺為每個活動驅動器提供了一個根目錄;UNIX 平臺只有一個根目錄,即 “/”。可用檔案系統根的設定受各種系統級操作的影響,比如可移動介質的插入和彈出,以及斷開或解除安裝那些物理磁碟或虛擬磁碟。

此方法返回一個 File 物件陣列,這些物件表示可用檔案系統根的根目錄。可以保證本地機器上物理存在的任何檔案的規範路徑名都以此方法返回的根之一開始。

返回:
表示可用檔案系統根的 File 物件陣列;如果無法確定根集,則返回 null。如果沒有檔案系統,那麼該陣列將為空。