Java-IO流——File類介紹
File類概述
- java.io.File代表與平臺無關的檔案或目錄。也就是說可以通過File類在Java程式中操作檔案或目錄。
- File類只能用來操作檔案或目錄(包括新建、刪除、重新命名檔案和目錄等操作),但不能用來訪問檔案中的內容。
- 如果需要訪問檔案中的內容,則需要使用輸入/輸出流。
絕對路徑和相對路徑、路徑分隔符
- Windows中絕對路徑以碟符開頭;Linux中絕對路徑以斜線
/
開頭; - 不以碟符和斜線
/
開頭的路徑就是相對路徑。預設情況下,系統總是依據使用者的工作路徑來解釋相對路徑,這個路徑由系統屬性user.dir
指定,通常也就是執行java虛擬機器時所在的路徑。 - Windows的路徑分隔符使用反斜線
\
/
),而Java程式中的反斜線表示轉義字元,所以如果需要在Windows的路徑中包括反斜線,則應該使用兩條反斜線\\
,如:C:\\adb\\text.txt
。 - Java程式支援將斜線
/
當成平臺無關的路徑分隔符,所以Java程式中表示Windows系統的路徑分隔符\\
可以用斜線/
代替。
一、File類的構造方法
public File(String pathname)
:根據指定的路徑(可以是絕對路徑或相對路徑)建立File物件。public File(String parent, String child)
:根據指定的父資料夾和子檔案或者子資料夾建立File物件public File(File parent, String child)
public File(URI uri)
:根據URI表示的檔案或目錄的路徑建立物件,如file:/F:/迅雷下載/test.txt
二、File類其他成員方法
訪問檔案或目錄的名稱和路徑的方法
-
public String getName()
: 返回File構造方法中傳入路徑表示的檔名或目錄名(如果是目錄名則是最後一級子目錄名) -
public String getPath()
: 返回File構造方法中傳入的路徑名 -
public String getParent()
:返回File構造方法中傳入檔案或目錄路徑的父目錄,如果傳入路徑沒有父目錄,則返回null -
public String getAbsolutePath()
: 返回File物件表示的檔案或目錄的絕對路徑名 -
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());
-
-
public boolean renameTo(File dest)
: 重新命名此File物件表示的檔案或目錄,重新命名成功返回true,失敗返回false。- 如果此File物件表示的檔案或目錄不存在,則重新命名會失敗;
- 如果dest表示的檔案或目錄存在,則重新命名失敗;
- 如果此File物件表示檔案,則即使dest構造方法傳入的是一個沒有檔名字尾的目錄路徑,則重新命名也成功,相當於將原來的帶字尾副檔名的檔案改成了不帶字尾副檔名的檔案。當然,重新命名時,也可以將dest的傳入路徑改成其他字尾副檔名格式的檔名。
- 如果此File物件表示目錄,則即使dest構造方法傳入的是一個帶字尾副檔名的檔案路徑,那麼重新命名也成功,相當於將字尾副檔名也當成是目錄名的一部分。
- 如果dest構造方法傳入的檔案或資料夾的路徑跟此File物件表示的檔案或資料夾不在同一級目錄下,則相當於移動原檔案或目錄到dest表示的路徑中去。
- 重新命名成功後,此File物件表示的檔案或目錄不再存在;而由於將原檔案或目錄移動到dest表示的路徑中去了,所以dest表示檔案或目錄由不存在變為存在。
檔案或目錄檢測相關的方法
public boolean exists()
: 判斷此File物件表示的檔案或目錄是否存在public boolean canWrite()
:判斷此File物件表示的檔案或目錄是否可寫public boolean canRead()
:判斷此File物件表示的檔案或目錄是否可讀public boolean isFile()
:判斷此File物件是否是表示檔案,而非目錄public boolean isDirectory()
:判斷此File物件是否是表示目錄,而非檔案public boolean isAbsolute()
:判斷此File物件的構造方法傳入的路徑是否是絕對路徑
獲取常規檔案資訊的方法
public long lastModified()
:返回檔案的最後修改時間public long length()
:返回檔案內容的長度
檔案或目錄操作相關的方法
-
public boolean createNewFile()
:建立一個此File物件所表示的檔案,返回true則建立成功,false則失敗。- 如果此File物件表示的檔案存在,則建立失敗;
- 如果此File物件表示的是一個存在的目錄,則建立失敗;
- 如果此File物件構造方法傳入路徑表示的檔案不存在,則建立成功。即使此路徑是一個不帶檔案字尾副檔名的目錄路徑,只要此路徑目錄不存在,也能建立成功,新建的檔名就是路徑最後一級子目錄名
-
public boolean mkdir()
:建立一個此File物件表示的目錄,返回true則建立成功,false則失敗。- 如果此File物件表示的是一個存在的目錄,則建立失敗;
- 如果表示的是一個存在的檔案,則也建立失敗;
- 如果此File物件傳入路徑表示的目錄不存在,則建立成功(其中如果傳入路徑包含父目錄,則要保證父目錄存在,否則也會建立失敗)。另外,即使傳入路徑是一個帶檔案字尾名的檔案路徑,只要此路徑檔案不存在,也能建立成功,新建目錄的最後一級子目錄名就是包含字尾名的檔名。
-
public boolean mkdirs()
:建立一個此File物件表示的目錄,如果File物件構造方法的傳入路徑包括父目錄,則當父目錄不存在時,也會自動建立不存在的父目錄。返回true建立成功,false則失敗。- 如果此File物件表示一個存在的檔案或目錄,則建立失敗;
- 如果此File物件構造方法的傳入路徑只是一級目錄路徑(即不包含父目錄),並且此路徑表示的目錄不存在,則也能建立成功;
- 與
mkdir
方法相比較,只是多了一個當傳入路徑包含父目錄,且此父目錄不存在時,會自動建立父目錄的功能。
-
public boolean delete()
:刪除此File物件表示的檔案或目錄,返回true則刪除成功,false則失敗。- 如果此File物件表示的檔案或目錄不存在,則刪除失敗;
- 如果此File物件表示的是一個目錄,則當此目錄下存在子目錄或檔案時,需把此目錄下的所有子目錄和檔案都刪除後,才能將此目錄刪除成功。
- Java程式的刪除不走回收站!
-
public void deleteOnExit()
:註冊一個刪除鉤子,指定當Java虛擬機器退出時,刪除此File物件表示的檔案或目錄。 -
public static File createTempFile(String prefix, String suffix)
: 在預設的臨時檔案目錄中建立一個臨時的空檔案,使用給定的字首、系統生成的隨機數、給定的字尾作為檔名。- 這是一個靜態方法,可以直接通過File類來呼叫;
- prefix字串長度必須不少於3個位元組,否則會報
java.lang.IllegalArgumentException: Prefix string too short
異常; - suffix引數可以為null,此時將使用預設的字尾".tmp";
-
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(); }
遍歷檔案或目錄的方法
-
public String[] list()
:- 若此File物件表示已存在的目錄,則返回此目錄下的所有檔名(不包括子目錄中的檔案)和一級子目錄名的字串陣列;若此目錄為空,則返回一個空陣列;
- 若此File物件表示已存在的檔案,則返回null;
- 若此File物件表示的目錄或檔案不存在,則返回null。
-
public File[] listFiles()
:作用同list()
方法類似,只不過返回的陣列元素是表示檔案或目錄的File物件。 -
public static File[] listRoots()
:返回系統所有的根路徑的File物件。Windows中返回的就是碟符。
檔案過濾器相關的方法
-
public File[] listFiles(FilenameFilter filter)
:返回此File物件下通過FilenameFilter過濾器過濾後的所有檔案和一級子目錄 -
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"); } });
-
檔案過濾器的應用
-
刪除目錄下的所有檔案(包括所有子目錄下的檔案)和所有子目錄(需要用到遞迴)
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()); }
-
遍歷目錄下的所有檔案路徑
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()); }