Java File类详解
在 Java 中,File 類是 java.io 包中唯一代表磁盤文件本身的對象,也就是說,如果希望在程序中操作文件和目錄,則都可以通過 File 類來完成。File 類定義了一些方法來操作文件,如新建、刪除、重命名文件和目錄等。
File 類不能訪問文件內容本身,如果需要訪問文件內容本身,則需要使用輸入/輸出流。
File 類提供了如下三種形式構造方法。
File(String path):如果 path 是實際存在的路徑,則該 File 對象表示的是目錄;如果 path 是文件名,則該 File 對象表示的是文件。File(String path, String name):path 是路徑名,name 是文件名。File(File dir, String name):dir 是路徑對象,name 是文件名。使用任意一個構造方法都可以創(chuàng)建一個 File 對象,然后調用其提供的方法對文件進行操作。
File類的常用方法
| boolean canRead() | 測試應用程序是否能從指定的文件中進行讀取 |
| boolean canWrite() | 測試應用程序是否能寫當前文件 |
| boolean delete() | 刪除當前對象指定的文件 |
| boolean exists() | 測試當前 File 是否存在 |
| String getAbsolutePath() | 返回由該對象表示的文件的絕對路徑名 |
| String getName() | 返回表示當前對象的文件名或路徑名(如果是路徑,則返回最后一級子路徑名) |
| String getParent() | 返回當前 File 對象所對應目錄(最后一級子目錄)的父目錄名 |
| boolean isAbsolute() | 測試當前 File 對象表示的文件是否為一個絕對路徑名。該方法消除了不同平臺的差異,可以直接判斷 file 對象是否為絕對路徑。在 UNIX/Linux/BSD 等系統(tǒng)上,如果路徑名開頭是一條斜線/,則表明該 File 對象對應一個絕對路徑;在 Windows 等系統(tǒng)上,如果路徑開頭是盤符,則說明它是一個絕對路徑。 |
| boolean isDirectory() | 測試當前 File 對象表示的文件是否為一個路徑 |
| boolean isFile() | 測試當前 File 對象表示的文件是否為一個“普通”文件 |
| long lastModified() | 返回當前 File 對象表示的文件最后修改的時間 |
| long length() | 返回當前 File 對象表示的文件長度 |
| String[] list() | 返回當前 File 對象指定的路徑文件列表 |
| String[] list(FilenameFilter) | 返回當前 File 對象指定的目錄中滿足指定過濾器的文件列表 |
| boolean mkdir() | 創(chuàng)建一個目錄,它的路徑名由當前 File 對象指定 |
| boolean mkdirs() | 創(chuàng)建一個目錄,它的路徑名由當前 File 對象指定 |
| boolean renameTo(File) | 將當前 File 對象指定的文件更名為給定參數(shù) File 指定的路徑名 |
File 類中有以下兩個常用常量:
public static final String pathSeparator:指的是分隔連續(xù)多個路徑字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld。public static final String separator:用來分隔同一個路徑字符串中的目錄的,Windows 下指/。例如 D:/Software/Common Files。注意:可以看到 File 類的常量定義的命名規(guī)則不符合標準命名規(guī)則,常量名沒有全部大寫,這是因為 Java 的發(fā)展經(jīng)過了一段相當長的時間,而命名規(guī)范也是逐步形成的,File 類出現(xiàn)較早,所以當時并沒有對命名規(guī)范有嚴格的要求,這些都屬于 Java 的歷史遺留問題。
Windows 的路徑分隔符使用反斜線“\”,而 Java 程序中的反斜線表示轉義字符,所以如果需要在Windows 的路徑下包括反斜線,則應該使用兩條反斜線或直接使用斜線“/”也可以。Java 程序支持將斜線當成平臺無關的路徑分隔符。假設在 Windows 操作系統(tǒng)中有一文件 D:\javaspace\hello.java,在 Java 中使用的時候,其路徑的寫法應該為 D:/javaspace/hello.java 或者 D:\javaspace\hello.java。
獲取文件屬性
在 Java 中獲取文件屬性信息的第一步是先創(chuàng)建一個 File 類對象并指向一個已存在的文件, 然后調用表 1 中的方法進行操作。
有一個文件位于 C:\windows\notepad.exe。編寫 Java 程序獲取并顯示該文件的長度、是否可寫、最后修改日期以及文件路徑等屬性信息。代碼如下:
public class Test {public static void main(String[] args) {String path = "C:/windows/"; // 指定文件所在的目錄File f = new File(path, "notepad.exe"); // 建立File變量,并設定由f變量引用System.out.println("C:\\windows\\notepad.exe文件信息如下:");System.out.println("============================================");System.out.println("文件長度:" + f.length() + "字節(jié)");System.out.println("文件或者目錄:" + (f.isFile() ? "是文件" : "不是文件"));System.out.println("文件或者目錄:" + (f.isDirectory() ? "是目錄" : "不是目錄"));System.out.println("是否可讀:" + (f.canRead() ? "可讀取" : "不可讀取"));System.out.println("是否可寫:" + (f.canWrite() ? "可寫入" : "不可寫入"));System.out.println("是否隱藏:" + (f.isHidden() ? "是隱藏文件" : "不是隱藏文件"));System.out.println("最后修改日期:" + new Date(f.lastModified()));System.out.println("文件名稱:" + f.getName());System.out.println("文件路徑:" + f.getPath());System.out.println("絕對路徑:" + f.getAbsolutePath());} }上述代碼中 File 類構造方法的第一個參數(shù)指定文件所在位置,這里使用C:/作為文件的實際路徑;第二個參數(shù)指定文件名稱。創(chuàng)建的 File 類對象為 f,然后通過 f 調用方法獲取相應的屬性,最終運行效果如下所示。
C:\windows\notepad.exe文件信息如下: ============================================ 文件長度:193536字節(jié) 文件或者目錄:是文件 文件或者目錄:不是目錄 是否可讀:可讀取 是否可寫:可寫入 是否隱藏:不是隱藏文件 最后修改日期:Mon Dec 28 02:55:19 CST 2016 文件名稱:notepad.exe 文件路徑:C:\windows\notepad.exe 絕對路徑:C:\windows\notepad.exe創(chuàng)建和刪除文件
File 類不僅可以獲取已知文件的屬性信息,還可以在指定路徑創(chuàng)建文件,以及刪除一個文件。創(chuàng)建文件需要調用 createNewFile() 方法,刪除文件需要調用 delete() 方法。無論是創(chuàng)建還是刪除文件通常都先調用 exists() 方法判斷文件是否存在。
在 C 盤上創(chuàng)建一個 test.txt 文件,程序啟動時會檢測該文件是否存在,如果不存在則創(chuàng)建;如果存在則刪除它再創(chuàng)建。
實現(xiàn)代碼如下:
public class Test {public static void main(String[] args) throws IOException {File f = new File("C:\\test.txt"); // 創(chuàng)建指向文件的File對象if (f.exists()) // 判斷文件是否存在{f.delete(); // 存在則先刪除}f.createNewFile(); // 再創(chuàng)建} }運行程序之后可以發(fā)現(xiàn),在 C 盤中已經(jīng)創(chuàng)建好了 test.txt 文件。但是如果在不同的操作系統(tǒng)中,路徑的分隔符是不一樣的,例如:
Windows 中使用反斜杠\表示目錄的分隔符。Linux 中使用正斜杠/表示目錄的分隔符。那么既然 Java 程序本身具有可移植性的特點,則在編寫路徑時最好可以根據(jù)程序所在的操作系統(tǒng)自動使用符合本地操作系統(tǒng)要求的分隔符,這樣才能達到可移植性的目的。要實現(xiàn)這樣的功能,則就需要使用 File 類中提供的兩個常量。
代碼修改如下:
public static void main(String[] args) throws IOException {String path = "C:" + File.separator + "test.txt"; // 拼湊出可以適應操作系統(tǒng)的路徑File f = new File(path);if (f.exists()) // 判斷文件是否存在{f.delete(); // 存在則先刪除}f.createNewFile(); // 再創(chuàng)建 }程序的運行結果和前面程序一樣,但是此時的程序可以在任意的操作系統(tǒng)中使用。
注意:在操作文件時一定要使用 File.separator 表示分隔符。在程序的開發(fā)中,往往會使用 Windows 開發(fā)環(huán)境,因為在 Windows 操作系統(tǒng)中支持的開發(fā)工具較多,使用方便,而在程序發(fā)布時往往是直接在 Linux 或其它操作系統(tǒng)上部署,所以這時如果不使用 File.separator,則程序運行就有可能存在問題。
創(chuàng)建和刪除目錄
File 類除了對文件的創(chuàng)建和刪除外,還可以創(chuàng)建和刪除目錄。創(chuàng)建目錄需要調用 mkdir() 方法,刪除目錄需要調用 delete() 方法。無論是創(chuàng)建還是刪除目錄都可以調用 exists() 方法判斷目錄是否存在。
判斷 C 盤根目錄下是否存在 config 目錄,如果存在則先刪除再創(chuàng)建。實現(xiàn)代碼如下:
public class Test {public static void main(String[] args) {String path = "C:/config/"; // 指定目錄位置File f = new File(path); // 創(chuàng)建File對象if (f.exists()) {f.delete();}f.mkdir(); // 創(chuàng)建目錄} }遍歷目錄
遍歷目錄可以在指定的目錄中查找文件,或者顯示所有的文件列表。File 類的 list() 方法提供了遍歷目錄功能,該方法有如下兩種重載形式。
1. String[] list()
該方法表示返回由 File 對象表示目錄中所有文件和子目錄名稱組成的字符串數(shù)組,如果調用的 File 對象不是目錄,則返回 null。
提示:list() 方法返回的數(shù)組中僅包含文件名稱,而不包含路徑。但不保證所得數(shù)組中的相同字符串將以特定順序出現(xiàn),特別是不保證它們按字母順序出現(xiàn)。
2. String[] list(FilenameFilter filter)
該方法的作用與 list() 方法相同,不同的是返回數(shù)組中僅包含符合 filter 過濾器的文件和目錄,如果 filter 為 null,則接受所有名稱。
遍歷 C 盤根目錄下的所有文件和目錄,并顯示文件或目錄名稱、類型及大小。使用 list() 方法的實現(xiàn)代碼如下:
public class Test {public static void main(String[] args) {File f = new File("C:/"); // 建立File變量,并設定由f變量變數(shù)引用System.out.println("文件名稱\t\t文件類型\t\t文件大小");System.out.println("===================================================");String fileList[] = f.list(); // 調用不帶參數(shù)的list()方法for (int i = 0; i < fileList.length; i++) { // 遍歷返回的字符數(shù)組System.out.print(fileList[i] + "\t\t");System.out.print((new File("C:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夾" + "\t\t");System.out.println((new File("C:/", fileList[i])).length() + "字節(jié)");}} }由于 list() 方法返回的字符數(shù)組中僅包含文件名稱,因此為了獲取文件類型和大小,必須先轉換為 File 對象再調用其方法。如下所示的是實例的運行效果:
文件名稱 文件類型 文件大小 =================================================== $Recycle.Bin 文件夾 4056字節(jié) Documents and Settings 文件夾 0字節(jié) Download 文件夾 12976326字節(jié) DRIVERS 文件夾 0字節(jié) FibocomLog 文件夾 67842字節(jié) Gateface 文件夾 0字節(jié) GFPageCache 文件夾 0字節(jié) hiberfil.sys 文件 3375026176字節(jié) Intel 文件夾 6782234字節(jié) KuGou 文件夾 0字節(jié) logs 文件夾 0字節(jié) msdia80.dll 文件 904704字節(jié) MSOCache 文件夾 0字節(jié) MyDownloads 文件夾 0字節(jié) MyDrivers 文件夾 946882字節(jié) news.template 文件 417字節(jié) NVIDIA 文件夾 0字節(jié) OneDriveTemp 文件夾 7834345字節(jié) opt 文件夾 0字節(jié) pagefile.sys 文件 644250944字節(jié) PerfLogs 文件夾 0字節(jié) Program Files 文件夾 12288字節(jié) Program Files (x86) 文件夾 8192字節(jié) ProgramData 文件夾 12588字節(jié) QMDownload 文件夾 0字節(jié) Recovery 文件夾 1289字節(jié) swapfile.sys 文件 268435456字節(jié) System Volume Information 文件夾 12288字節(jié) Users 文件夾 4096字節(jié) Windows 文件夾 16784字節(jié)希望只列出目錄下的某些文件,這就需要調用帶過濾器參數(shù)的 list() 方法。首先需要創(chuàng)建文件過濾器,該過濾器必須實現(xiàn) java.io.FilenameFilter 接口,并在 accept() 方法中指定允許的文件類型。
允許 SYS、TXT 和 BAK 格式文件的過濾器實現(xiàn)代碼:
public class ImageFilter implements FilenameFilter {// 實現(xiàn) FilenameFilter 接口@Overridepublic boolean accept(File dir, String name) {// 指定允許的文件類型return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");} }上述代碼創(chuàng)建的過濾器名稱為 ImageFilter,接下來只需要將該名稱傳遞給 list() 方法即可實現(xiàn)篩選文件。
String fileList[] = f.list(new ImageFilter());再次運行程序,遍歷結果如下所示:
文件名稱 文件類型 文件大小 =================================================== offline_FtnInfo.txt 文件 236字節(jié) pagefile.sys 文件 84365940字節(jié)總結
以上是生活随笔為你收集整理的Java File类详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jsoup设置一个元素的HTML内容
- 下一篇: Spring Boot 后台验证 Hib