Java 之 File類(文件操作)


一、概述

  java.io.File 類是文件目錄路徑名的抽象表示,主要用於文件和目錄的創建、查找和刪除等操作。

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

     File 是文件和目錄路徑名的抽象表示形式,即File類的對象代表一個文件或一個目錄(文件夾)的路徑,而不是文件本身。

  File 類不能直接訪問文件內容本身,如果需要訪問文件內容本身,則需要使用輸入/輸出流。

  路徑問題

    絕對路徑:從盤符開始的路徑,這是一個完整的路徑。如:E:\\a.txt

    相對路徑:相當於項目目錄的路徑,這個一個便捷的路徑。如:../a.txt

  注意

    1. 路徑不區分大小寫

    2. 路徑中的文件名稱分隔符 window 使用反斜杠(\)也支持斜杠(/),反斜杠是轉義字符,兩個反斜杠代表一個普通的反斜杠

    3. 其他的平台都使用斜杠作為分隔符(/),網絡地址也是(http://www.baidu.com)。

    4. window 的路徑分隔符使用“\”,而Java程序中的“\”表示轉義字符,所以在Windows中表示路徑,需要用“\\”。或者直接使用“/”也可以,Java程序支持將“/”當成平台無關的路徑分隔符。或者直接使用File.separator常量值表示。

    5. 路徑中如果出現 “..” 表示上一級目錄,路徑名如果以“/”開頭,表示從“根目錄”下開始導航。

 

二、構造方法

  1、方式一

public File(String pathname) :通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例。

    注意

      ① String pathname: 代表字符串的路徑名稱

      ② 路徑可以是文件結尾,也可以是文件夾結尾

      ③ 路徑可以是相對路徑,也可以絕對路徑

      ④ 路徑可以是存在,也可以是不存在

      ⑤ 創建File對象,只是把字符串路徑封裝為File對象,不考慮路徑的真假情況

    Demo:

1 File f1 = new File("E:\\a.txt"); 2 System.out.println(f1); // E:\\a.txt 3 
4 File f2 = new File("a.txt"); 5 System.out.println(f2);  // a.txt

    可以看出 File 這個類里面重寫了 Object 類的 toString 方法。

  2、方式二

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

    參數:把路徑分為了兩部分

      String parent:父路徑

      String child:子路徑

     優點:父路徑和子路徑,可以單獨書寫,使用起來非常靈活;父路徑和子路徑都可以變化

    Demo:

1 File file = new File("C:\\","a.txt"); 2 System.out.println(file);     //c:\a.txt

  3、方式三

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

    參數:把路徑分成兩部分

       File parent:父路徑

      String child:子路徑

     優點

      ① 父路徑和子路徑,可以單獨書寫,使用起來非常靈活;父路徑和子路徑都可以變化

      ② 父路徑是File類型,可以使用File的方法對路徑進行一些操作,再使用路徑創建對象

    Demo:

1 File parent = new File("c:\\"); 2 File file = new File(parent,"hello.java"); 3 System.out.println(file);//c:\hello.java

     注意

    ① 一個 File 對象代表硬盤實際存在一個文件或者目錄。

    ② 無論該路徑下是否存在文件或者目錄,都不影響 File 對象的創建。

  4、方式四

public File(URI uri):通過將給定的 file: URI 轉換為一個抽象路徑名來創建一個新的 File 實例。

  

三、File類中的字段信息

  File 類中提供了四個類常量:

public static final char separatorChar:與系統有關的默認名稱分隔符。此字段被初始化為包含系統屬性 file.separator 值的第一個字符。
                         在 UNIX 系統上,此字段的值為 '/';在 Microsoft Windows 系統上,它為 '\\'。 public static final String separator:與系統有關的默認名稱分隔符,為了方便,它被表示為一個字符串。此字符串只包含一個字符,即 separatorChar。 public static final char pathSeparatorChar:與系統有關的路徑分隔符。此字段被初始為包含系統屬性 path.separator 值的第一個字符。
                           此字符用於分隔以路徑列表 形式給定的文件序列中的文件名。在 UNIX 系統上,此字段為 ':';在 Microsoft Windows 系統上,它為 ';'。 public static final String pathSeparator:與系統有關的路徑分隔符,為了方便,它被表示為一個字符串。此字符串只包含一個字符,即 pathSeparatorChar。

  Demo:

 1       String pathSeparator = File.pathSeparator;  2         //System.out.println(pathSeparator);//路徑分隔符 windows:分號; linux:冒號:
 3 
 4         String separator = File.separator;  5         //System.out.println(separator);// 文件名稱分隔符 windows:反斜杠\ linux:正斜杠/
 6         
 7         System.out.println(File.separator);          // \
 8         System.out.println(File.separatorChar);      // \
 9         System.out.println(File.pathSeparator);      // ;
10         System.out.println(File.pathSeparatorChar);  // ;

 

四、常用方法

  (1)獲取文件或目錄的詳細信息

String getName():     返回由此抽象路徑名表示的文件或目錄的名稱。
long length() :       返回由此抽象路徑名表示的文件的長度。(只能返回文件大小,不能直接返回目錄大小)
boolean exists() :    測試此抽象路徑名表示的文件或目錄是否存在。 
boolean isHidden() :  測試此抽象路徑名指定的文件是否是一個隱藏文件。
boolean canRead() :   測試應用程序是否可以讀取此抽象路徑名表示的文件。
boolean canWrite() :  測試應用程序是否可以修改此抽象路徑名表示的文件   
long lastModified() : 返回此抽象路徑名表示的文件最后一次被修改的時間。(毫秒值)
String toString() :   返回此抽象路徑名的路徑名字符串。
boolean isAbsolute(): 測試File對象對應的文件或目錄是否是絕對路徑。 String getParent() : 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。(返回父目錄名稱) File getParentFile() :返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。(返回父目錄的File對象)

    注意以上都是對應於 File 對象的屬性信息,如果File對象是一個不存在的文件或目錄,返回的都是對應屬性的默認值,例:獲取的length()為0,isFile()為False等, name,path這些都是有值的,因為這些屬性是通過構造方法創建 File 時指定的,而其他的屬性都是默認值。

  (2)獲取文件或目錄的路徑

String getPath() : 將此抽象路徑名轉換為一個路徑名字符串。 
File getAbsoluteFile() : 返回此抽象路徑名的絕對路徑名形式。 
String getAbsolutePath():返回此抽象路徑名的絕對路徑名字符串。 返回絕對路徑,從根目錄開始導航
File getCanonicalFile(): 返回此抽象路徑名的規范形式。 
String getCanonicalPath() :返回此抽象路徑名的規范路徑名字符串。規范路徑就是路徑里沒有./或../或/,會把這些自動解析

  (3)操作文件或目錄

boolean createNewFile():當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。(只創建文件)
boolean delete(): 刪除此抽象路徑名表示的文件或目錄。(可以刪除文件或刪除空目錄)刪除成功,返回true,失敗false。  
boolean equals(Object obj):測試此抽象路徑名與給定對象是否相等。 
boolean mkdir() : 創建此抽象路徑名指定的目錄。(只能創建一級目錄)必須確保父目錄存在,否則創建失敗。 
boolean mkdirs(): 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。 (可以創建多級目錄)如果父目錄不存在,會一同創建父目錄
boolean renameTo(File dest) :重新命名此抽象路徑名表示的文件。(可以給文件或目錄重命名) 

  (4)判斷是文件還是目錄

boolean isFile() :測試此抽象路徑名表示的文件是否是一個標准文件。 
boolean isDirectory():測試此抽象路徑名表示的文件是否是一個目錄。 

  (5)獲取目錄的下一級

String[] list() :返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。 
File[] listFiles() :返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件。(獲取下一級的文件/目錄的File對象) 
static File[] listRoots():列出可用的文件系統根。 

  

  1、獲取功能的方法

    a、獲取絕對路徑名

public String getAbsolutePath() :返回此File的絕對路徑名字符串。

     獲取的是構造方法中傳遞的路徑,無論路徑是絕對的還是相對的,getAbsolutePath方法返回的都是絕對路徑

    Demo:

1 File f1 = new File("E:\\a.txt"); 2 String absolutePath2 = f1.getAbsolutePath(); 3 System.out.println(absolutePath); // E:\\a.txt 4 
5 File f2 = new File("a.txt"); 6 String absolutePath2 = f2.getAbsolutePath(); 7 System.out.println(absolutePath);       // E:\\a.txt

    b、獲取路徑名

public String getPath() :將此File轉換為路徑名字符串。

      獲取的構造方法中傳遞的路徑,File 類中的 toString方法調用的 getPath 方法      

     Demo:

1  File f1 = new File("E:\\java\\a.txt"); 2  File f2 = new File("a.txt"); 3  String path1 = f1.getPath(); 4  System.out.println(path1);  // E:\java\a.txt
5  String path2 = f2.getPath(); 6  System.out.println(path2);  //a.txt

    c、獲取文件或目錄名稱

public String getName()  :返回由此File表示的文件或目錄的名稱。

    獲取的就是構造方法傳遞路徑的結尾部分(文件/文件夾)  

     Demo:

1 File f1 = new File("E:\\java\\a.txt"); 2 String name1 = f1.getName(); 3 System.out.println(name1);   //a.txt
4 
5 File f2 = new File("E:\\java"); 6 String name2 = f2.getName(); 7 System.out.println(name2);   // java

    d、獲取文件長度

public long length()  :返回由此File表示的文件的長度。

     獲取的是構造方法指定的文件的大小,以字節為單位。

     注意:

        ①  文件夾是沒有大小概念的,不能獲取文件夾的大小

        ②  如果構造方法中給出的路徑不存在,那么length方法返回0

    Demo:

1 File f1 = new File("E:\\java\\a\\1.jpg"); // 該文件存在 2 long l1 = f1.length(); 3 System.out.println(l1);//78831字節
4 
5 File f2 = new File("E:\\java\\a\\2.jpg"); // 該文件不存在 6 System.out.println(f2.length());//0
7 
8 File f3 = new File("E:\\java\\a"); // a 為一個文件夾 9 System.out.println(f3.length());//0 文件夾沒有大小概念的

  2、判斷功能的方法

      a、判斷文件或目錄是否存在

public boolean exists() :此File表示的文件或目錄是否實際存在。

      用於判斷構造方法中的路徑是否存在,存在為 true;不存在為 false

        Demo:

 1  File f1 = new File("E:\\java\\aaa\\bbb");  2  System.out.println(f1.exists());//true
 3 
 4  File f2 = new File("E:\\java\\aaa\\bb"); // 該路徑不存在  5  System.out.println(f2.exists());//false
 6 
 7  File f3 = new File("a.txt");              //相對路徑 E:\java\a\a.txt
 8  System.out.println(f3.exists());//true
 9 
10  File f4 = new File("a.txt"); // 該文件不存在 11  System.out.println(f4.exists());//false

      b、File 表示的是否為目錄

public boolean isDirectory() :此File表示的是否為目錄。

      用於判斷構造方法中給定的路徑是否以文件夾結尾。 是:true; 否:false  

      注意:使用該方法前提,路徑必須是存在的,否則都返回false,與下面方法互斥

      c、File 表示的是否為文件

public boolean isFile() :此File表示的是否為文件。

      用於判斷構造方法中給定的路徑是否以文件結尾。是:true;否:false 

       注意:使用該方法前提,路徑必須是存在的,否則都返回false,與上面方法互斥

       Demo:

 1 File f1 = new File("E:\\java\\aaa\\bbb");  2 
 3   //不存在,就沒有必要獲取
 4   if(f1.exists()){  5    System.out.println(f1.isDirectory());  6    System.out.println(f1.isFile());  7   }  8 
 9 File f2 = new File("E:\\java\\aaa\\bbb"); 10   if(f2.exists()){ 11        System.out.println(f2.isDirectory());//true
12        System.out.println(f2.isFile());//false
13  } 14 
15 File f3 = new File("E:\\java\\aaa\\bbb\\a.txt"); 16     if(f3.exists()){ 17         System.out.println(f3.isDirectory());//false
18         System.out.println(f3.isFile());//true
19     }

  3、創建刪除功能的方法

    a、創建文件

public boolean createNewFile() :當且僅當具有該名稱的文件尚不存在時,創建一個新的空文件。

    創建文件的路徑和名稱在構造方法中給出(構造方法的參數)

    返回值:布爾值;true:文件不存在,創建文件,返回 true;false:文件存在,不會創建,返回 false;

    注意

      ① 此方法只能創建文件,不能創建文件夾

      ② 創建文件的路徑必須存在,否則會拋出異常

    Demo:

 1  File f1 = new File("E:\\java\\aaa\\bbb\\a.txt");  2  boolean b1 = f1.createNewFile();  3  System.out.println("b1:"+b1); // true 成功創建  4 
 5  File f2 = new File("bbb\\2.txt");  6  System.out.println(f2.createNewFile());  7 
 8  File f3 = new File("bbb\\新建文件夾");  9  System.out.println(f3.createNewFile());    //創建的是一個文件,不是文件夾,不要被名稱迷糊,要看類型
10 
11  File f4 = new File("abc\\3.txt"); 12  System.out.println(f4.createNewFile());     //路徑不存在,拋出IOException

    b、刪除文件或者目錄

public boolean delete() :刪除由此File表示的文件或目錄。

       創建單級文件夾 

       創建文件夾的路徑和名稱在構造方法中給出(構造方法的參數)

       返回值

        true:文件夾不存在,創建文件夾;

        false:文件夾存在,不會創建,構造方法中給出的路徑不存在也會返回 false

        注意:此方法只能創建文件夾,不能創建文件

    c、創建單個目錄

public boolean mkdir() :創建由此File表示的目錄。

       既可以創建單級文件夾,也可以創建多級文件夾

        創建文件夾的路徑和名稱在構造方法中給出(構造方法的參數)

       返回值

        true:文件夾不存在,創建文件夾;

        false:文件夾存在,不會創建,構造方法中給出的路徑不存在也會返回 false

       注意:此方法只能創建文件夾,不能創建文件

      Demo:

 1  File f1 = new File("java\\aaa\\aa");  2  boolean b1 = f1.mkdir();  3  System.out.println("b1:"+b1); // true  4 
 5  File f2 = new File("java\\111\\222\\333\\444");  6  boolean b2 = f2.mkdirs();  7  System.out.println("b2:"+b2); // true  8 
 9  File f3 = new File("java\\abc.txt"); 10  boolean b3 = f3.mkdirs();            //看類型,是一個文件
11  System.out.println("b3:"+b3); 12 
13  File f4 = new File("jav\\ccc"); 14  boolean b4 = f4.mkdirs();            //不會拋出異常,路徑不存在,不會創建
15  System.out.println("b4:"+b4);

    d、創建文件或目錄

public boolean mkdirs() :創建由此File表示的目錄,包括任何必需但不存在的父目錄。

     該方法刪除構造方法路徑中給出的文件 / 文件夾

    返回值

      true:文件 / 文件夾刪除成功,返回 true

      false:文件夾中有內容,不會刪除返回 false;構造方法中路徑不存在false

    注意

      ① delete方法是直接在硬盤刪除文件/文件夾,不走回收站,刪除要謹慎

      ② delete方法,如果此File表示目錄,則目錄必須為空才能刪除。

    Demo:

1 File f1 = new File("java\\新建文件夾"); 2 boolean b1 = f1.delete(); 3 System.out.println("b1:"+b1); 4 
5 File f2 = new File("java\\abc.txt"); 6 System.out.println(f2.delete());

    擴展:創建臨時文件,通常結合 deleteOnExit() 使用

public static File createTempFile(String prefix,String suffix) throws IOException在默認臨時文件目錄中創建一個空文件,使用給定前綴和后綴生成其名稱。調用此方法等同於調用 createTempFile(prefix, suffix, null)。
public static File createTempFile(String prefix,String suffix,File directory)throws IOException在指定目錄中創建一個新的空文件,使用給定的前綴和后綴字符串生成其名稱。

      prefix:用於生成文件名的前綴字符串:必須至少三個字符。

       suffix:用於生成文件名的后綴字符串:如果為 null,默認為 “.tmp”

       directory:將創建的文件所在的目錄;如果使用默認臨時文件目錄,則該參數為 null

public void deleteOnExit():當退出JVM時,刪除文件,一般用於刪除臨時文件

      Demo:

1   @Test 2     public void test() throws IOException{ 3         File tempFile = File.createTempFile("Hello", ".tmp"); 4         //....省略代碼
5  tempFile.deleteOnExit(); 6     }

 

五、目錄的遍歷

  File 類遍歷(文件夾)目錄功能

public String[] list() :返回一個String數組,表示該File目錄中的所有子文件或目錄。
public File[] listFiles() :返回一個File數組,表示該File目錄中的所有的子文件或目錄。

   注意

    ① list 方法和 listFiles 方法遍歷的是構造方法中給出的目錄

    ② 如果構造方法中給出的目錄的路徑不存在,會拋出空指針異常

    ③ 如果構造方法中給出的路徑不是一個目錄,也會拋出異常。

    ④ 調用listFiles方法的File對象,表示的必須是實際存在的目錄,否則返回null,無法進行遍歷

  Demo:

 1  /*
 2  public File[] listFiles() :返回一個File數組,表示該File目錄中的所有的子文件或目錄。  3  遍歷構造方法中給出的目錄,會獲取目錄中所有的文件/文件夾,把文件/文件夾封裝為File對象,多個File對象存儲到File數組中  4   */
 5   /*
 6  public String[] list() :返回一個String數組,表示該File目錄中的所有子文件或目錄。  7  遍歷構造方法中給出的目錄,會獲取目錄中所有文件/文件夾的名稱,把獲取到的多個名稱存儲到一個String類型的數組中  8   */
 9 
10   public void listSubFiles(File dir) { 11         if (dir != null && dir.isDirectory()) { 12             File[] listFiles = dir.listFiles(); 13             if (listFiles != null) { 14                 for (File sub : listFiles) { 15  listSubFiles(sub); 16  } 17  } 18  } 19  System.out.println(dir); 20     }

 


免責聲明!

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



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