1. 程式人生 > >Java-IO流——File類介紹

Java-IO流——File類介紹

File類概述

  • java.io.File代表與平臺無關的檔案或目錄。也就是說可以通過File類在Java程式中操作檔案或目錄。
  • File類只能用來操作檔案或目錄(包括新建、刪除、重新命名檔案和目錄等操作),但不能用來訪問檔案中的內容。
  • 如果需要訪問檔案中的內容,則需要使用輸入/輸出流。
絕對路徑和相對路徑、路徑分隔符
  1. Windows中絕對路徑以碟符開頭;Linux中絕對路徑以斜線/開頭;
  2. 不以碟符和斜線/開頭的路徑就是相對路徑。預設情況下,系統總是依據使用者的工作路徑來解釋相對路徑,這個路徑由系統屬性user.dir指定,通常也就是執行java虛擬機器時所在的路徑。
  3. Windows的路徑分隔符使用反斜線\
    (Linux中使用斜線/),而Java程式中的反斜線表示轉義字元,所以如果需要在Windows的路徑中包括反斜線,則應該使用兩條反斜線\\,如:C:\\adb\\text.txt
  4. Java程式支援將斜線/當成平臺無關的路徑分隔符,所以Java程式中表示Windows系統的路徑分隔符\\可以用斜線/代替。

一、File類的構造方法

  1. public File(String pathname):根據指定的路徑(可以是絕對路徑或相對路徑)建立File物件。
  2. public File(String parent, String child):根據指定的父資料夾和子檔案或者子資料夾建立File物件
  3. public File(File parent, String child)
    :根據指定的父資料夾物件和子檔案或者子資料夾建立File物件
  4. public File(URI uri):根據URI表示的檔案或目錄的路徑建立物件,如file:/F:/迅雷下載/test.txt

二、File類其他成員方法

訪問檔案或目錄的名稱和路徑的方法

  1. public String getName(): 返回File構造方法中傳入路徑表示的檔名或目錄名(如果是目錄名則是最後一級子目錄名)

  2. public String getPath(): 返回File構造方法中傳入的路徑名

  3. public String getParent():返回File構造方法中傳入檔案或目錄路徑的父目錄,如果傳入路徑沒有父目錄,則返回null

  4. public String getAbsolutePath(): 返回File物件表示的檔案或目錄的絕對路徑名

  5. public File getAbsoluteFile(): 返回一個通過此File物件表示的檔案或目錄的絕對路徑名重新new出來的一個File物件

    • 即使File物件表示的檔案或目錄不存在,也不影響上述方法獲取File物件表示的檔案或目錄的名稱和路徑。

        File f2 = new File("F:/迅雷下載/java基礎/day19-異常、IO-File/day19_code/講師程式碼/day19_File/bbb/ccc/text.txt");
        System.out.println(f2.exists());
        System.out.println(f2.getName());
        System.out.println(f2.getPath());
        System.out.println(f2.getParent());
        System.out.println(f2.getAbsolutePath());
        
        System.out.println("------------------");
        File f3 = new File("bbb/ccc/text.txt");
        System.out.println(f3.exists());
        System.out.println(f3.getName());
        System.out.println(f3.getPath());
        System.out.println(f3.getParent());
        System.out.println(f3.getAbsolutePath());
        
        System.out.println("------------------");
        File f4 = new File("text.txt");
        System.out.println(f4.exists());
        System.out.println(f4.getName());
        System.out.println(f4.getPath());
        System.out.println(f4.getParent());
        System.out.println(f4.getAbsolutePath());
      
        System.out.println("------------------");
        File absoluteFile = f4.getAbsoluteFile();
        System.out.println(absoluteFile.exists());
        System.out.println(absoluteFile.getName());
        System.out.println(absoluteFile.getPath());
        System.out.println(absoluteFile.getParent());
        System.out.println(absoluteFile.getAbsolutePath());
      

  6. public boolean renameTo(File dest): 重新命名此File物件表示的檔案或目錄,重新命名成功返回true,失敗返回false。

    • 如果此File物件表示的檔案或目錄不存在,則重新命名會失敗;
    • 如果dest表示的檔案或目錄存在,則重新命名失敗;
    • 如果此File物件表示檔案,則即使dest構造方法傳入的是一個沒有檔名字尾的目錄路徑,則重新命名也成功,相當於將原來的帶字尾副檔名的檔案改成了不帶字尾副檔名的檔案。當然,重新命名時,也可以將dest的傳入路徑改成其他字尾副檔名格式的檔名。
    • 如果此File物件表示目錄,則即使dest構造方法傳入的是一個帶字尾副檔名的檔案路徑,那麼重新命名也成功,相當於將字尾副檔名也當成是目錄名的一部分。
    • 如果dest構造方法傳入的檔案或資料夾的路徑跟此File物件表示的檔案或資料夾不在同一級目錄下,則相當於移動原檔案或目錄到dest表示的路徑中去。
    • 重新命名成功後,此File物件表示的檔案或目錄不再存在;而由於將原檔案或目錄移動到dest表示的路徑中去了,所以dest表示檔案或目錄由不存在變為存在。

檔案或目錄檢測相關的方法

  1. public boolean exists(): 判斷此File物件表示的檔案或目錄是否存在
  2. public boolean canWrite():判斷此File物件表示的檔案或目錄是否可寫
  3. public boolean canRead():判斷此File物件表示的檔案或目錄是否可讀
  4. public boolean isFile():判斷此File物件是否是表示檔案,而非目錄
  5. public boolean isDirectory():判斷此File物件是否是表示目錄,而非檔案
  6. public boolean isAbsolute():判斷此File物件的構造方法傳入的路徑是否是絕對路徑

獲取常規檔案資訊的方法

  1. public long lastModified():返回檔案的最後修改時間
  2. public long length():返回檔案內容的長度

檔案或目錄操作相關的方法

  1. public boolean createNewFile():建立一個此File物件所表示的檔案,返回true則建立成功,false則失敗。

    • 如果此File物件表示的檔案存在,則建立失敗;
    • 如果此File物件表示的是一個存在的目錄,則建立失敗;
    • 如果此File物件構造方法傳入路徑表示的檔案不存在,則建立成功。即使此路徑是一個不帶檔案字尾副檔名的目錄路徑,只要此路徑目錄不存在,也能建立成功,新建的檔名就是路徑最後一級子目錄名
  2. public boolean mkdir():建立一個此File物件表示的目錄,返回true則建立成功,false則失敗。

    • 如果此File物件表示的是一個存在的目錄,則建立失敗;
    • 如果表示的是一個存在的檔案,則也建立失敗;
    • 如果此File物件傳入路徑表示的目錄不存在,則建立成功(其中如果傳入路徑包含父目錄,則要保證父目錄存在,否則也會建立失敗)。另外,即使傳入路徑是一個帶檔案字尾名的檔案路徑,只要此路徑檔案不存在,也能建立成功,新建目錄的最後一級子目錄名就是包含字尾名的檔名。
  3. public boolean mkdirs():建立一個此File物件表示的目錄,如果File物件構造方法的傳入路徑包括父目錄,則當父目錄不存在時,也會自動建立不存在的父目錄。返回true建立成功,false則失敗。

    • 如果此File物件表示一個存在的檔案或目錄,則建立失敗;
    • 如果此File物件構造方法的傳入路徑只是一級目錄路徑(即不包含父目錄),並且此路徑表示的目錄不存在,則也能建立成功;
    • mkdir方法相比較,只是多了一個當傳入路徑包含父目錄,且此父目錄不存在時,會自動建立父目錄的功能。
  4. public boolean delete():刪除此File物件表示的檔案或目錄,返回true則刪除成功,false則失敗。

    • 如果此File物件表示的檔案或目錄不存在,則刪除失敗;
    • 如果此File物件表示的是一個目錄,則當此目錄下存在子目錄或檔案時,需把此目錄下的所有子目錄和檔案都刪除後,才能將此目錄刪除成功。
    • Java程式的刪除不走回收站!
  5. public void deleteOnExit():註冊一個刪除鉤子,指定當Java虛擬機器退出時,刪除此File物件表示的檔案或目錄。

  6. public static File createTempFile(String prefix, String suffix): 在預設的臨時檔案目錄中建立一個臨時的空檔案,使用給定的字首、系統生成的隨機數、給定的字尾作為檔名。

    • 這是一個靜態方法,可以直接通過File類來呼叫;
    • prefix字串長度必須不少於3個位元組,否則會報java.lang.IllegalArgumentException: Prefix string too short異常;
    • suffix引數可以為null,此時將使用預設的字尾".tmp";
  7. public static File createTempFile(String prefix, String suffix, File directory):在directory指定的父目錄中建立一個臨時的空檔案。

     try {
     	File f2 = File.createTempFile("zengk", null);
     	System.out.println(f2.getPath());
     	System.out.println(f2.getAbsolutePath());
     } catch (IOException e) {
     	e.printStackTrace();
     }
    
     System.out.println("---------------");		
    
     try {
     	File f2 = File.createTempFile("zengk", ".java", new File("./"));
     	System.out.println(f2.getPath());
     	System.out.println(f2.getAbsolutePath());
     } catch (IOException e) {
     	e.printStackTrace();
     }
    

遍歷檔案或目錄的方法

  1. public String[] list()

    • 若此File物件表示已存在的目錄,則返回此目錄下的所有檔名(不包括子目錄中的檔案)和一級子目錄名的字串陣列;若此目錄為空,則返回一個空陣列;
    • 若此File物件表示已存在的檔案,則返回null;
    • 若此File物件表示的目錄或檔案不存在,則返回null。
  2. public File[] listFiles():作用同list()方法類似,只不過返回的陣列元素是表示檔案或目錄的File物件。

  3. public static File[] listRoots():返回系統所有的根路徑的File物件。Windows中返回的就是碟符。

檔案過濾器相關的方法

  1. public File[] listFiles(FilenameFilter filter):返回此File物件下通過FilenameFilter過濾器過濾後的所有檔案和一級子目錄

  2. public File[] listFiles(FileFilter filter):返回此File物件下通過FileFilter過濾器過濾後的所有檔案和一級子目錄

    • FilenameFilter和FileFilter過濾器的區別就是accept抽象方法接收的形參不同,FilenameFilter的accept方法接收檔案的父目錄dir和檔名name,一般是在accept方法重寫時通過new File(dir, name)得到檔案的File物件。而FileFilter的accept方法直接接收檔案的File物件,較FilenameFilter省略了new一個File物件的步驟。

        //FilenameFilter類的定義
        package java.io;
        public interface FilenameFilter {
            boolean accept(File dir, String name);
        }
      
        //FileFilter類的定義
        package java.io;
        public interface FileFilter {
            boolean accept(File pathname);
        }
      
        //listFiles(FilenameFilter filter)方法的定義
        public File[] listFiles(FilenameFilter filter) {
            String ss[] = list();
            if (ss == null) return null;
            ArrayList<File> files = new ArrayList<>();
            for (String s : ss)
                if ((filter == null) || filter.accept(this, s))
                    files.add(new File(s, this));
            return files.toArray(new File[files.size()]);
        }
        
        //listFiles(FileFilter filter)方法的定義
        public File[] listFiles(FileFilter filter) {
            String ss[] = list();
            if (ss == null) return null;
            ArrayList<File> files = new ArrayList<>();
            for (String s : ss) {
                File f = new File(s, this);
                if ((filter == null) || filter.accept(f))
                    files.add(f);
            }
            return files.toArray(new File[files.size()]);
        }
      
        舉例:
        File file = new File("d:\\");
        String[] strArray = file.list(new FilenameFilter() {
        	@Override
        	public boolean accept(File dir, String name) {
        		// 判斷是否是檔案,是否是以.mp4結尾
        		File file = new File(dir, name);
        		return file.isFile() && name.endsWith(".mp4");
        	}
        });
      
        File file = new File("d:\\");
        String[] strArray = file.list(new FileFilter() {
        	@Override
        	public boolean accept(File pathname) {
        		// 判斷是否是檔案,是否是以.mp4結尾
        		return pathname.isFile() && pathname.endsWith(".mp4");
        	}
        });
      

檔案過濾器的應用

  1. 刪除目錄下的所有檔案(包括所有子目錄下的檔案)和所有子目錄(需要用到遞迴)

     File file = new File("D:\\test");
     //刪除test資料夾
     deleteFiles(file);
    
     private static void deleteFiles(File file) {
     	File[] fileArray = file.listFiles();
     	
     	if (fileArray != null) {
     		//如果封裝的資料夾不為空,那麼就進行遍歷,獲得每一個檔案或資料夾
     		for (File f : fileArray) {
     			if (f.isDirectory()) {
     				//如果被封裝資料夾的子檔案還是個資料夾,那麼繼續封裝起來進行判斷
     				deleteFiles(f);
     			} else {
     				//如果被封裝起來的子資料夾正好就是個檔案,那麼直接刪除
     				System.out.println(f.getName() + "***" + f.delete());
     			}
     		}
     	} 
     	System.out.println(file.getName() + "***" + file.delete());
     }
    
  2. 遍歷目錄下的所有檔案路徑

     File file = new File("D:\\test");
     showFiles(file);
    
     private static void showFiles(File file) {
     	// 獲取該目錄下的所有檔案或者資料夾的File[]陣列。
     	File[] fileArray = file.listFiles();
    
     	if(fileArray != null){
     		// 遍歷File[]陣列,獲取到每一個File物件
     		for (File f : fileArray) {
     			// 判斷該File對數是否是目錄
     			if (f.isDirectory()) {
     				showFiles(f);
     			} else {
     				// 輸入檔案路徑
     				System.out.println(f.getAbsolutePath());
     			}
     		}
     	}
    
     	System.out.println(file.getAbsolutePath());
     }