Java中的File類你知道多少?

File概述

在 Java 中,File 類是 java.io 包中惟一表明磁盤文件自己的對象,也就是說,若是但願在程序中操做文件和目錄,則均可以經過 File 類來完成。File 類定義了一些方法來操做文件,如新建、刪除、重命名文件和目錄等。java

File類的構造方法

File 類提供了以下三種形式構造方法。windows

  1. File(String path):若是 path 是實際存在的路徑,則該 File 對象表示的是目錄;若是 path 是文件名,則該 File 對象表示的是文件。
  2. File(String path, String name):path 是路徑名,name 是文件名。
  3. File(File dir, String name):dir 是路徑對象,name 是文件名。

使用任意一個構造方法均可以建立一個 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 等系統上,若是路徑名開頭是一條斜線/,則代表該 File 對象對應一個絕對路徑;在 Windows 等系統上,若是路徑開頭是盤符,則說明它是一個絕對路徑。
boolean isDirectory() 測試當前 File 對象表示的文件是否爲一個路徑
boolean isFile() 測試當前 File 對象表示的文件是否爲一個「普通」文件
long lastModified() 返回當前 File 對象表示的文件最後修改的時間
long length() 返回當前 File 對象表示的文件長度
String[] list() 返回當前 File 對象指定的路徑文件列表
String[] list(FilenameFilter) 返回當前 File 對象指定的目錄中知足指定過濾器的文件列表
boolean mkdir() 建立一個目錄,它的路徑名由當前 File 對象指定
boolean mkdirs() 建立一個目錄,它的路徑名由當前 File 對象指定
boolean renameTo(File) 將當前 File 對象指定的文件改名爲給定參數 File 指定的路徑名

File類中的倆個經常使用變量

  • public static final String pathSeparator:指的是分隔連續多個路徑字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld。
  • public static final String separator:用來分隔同一個路徑字符串中的目錄的,Windows 下指/。例如 C:/Program Files/Common Files。

注意:

能夠看到 File 類的常量定義的命名規則不符合標準命名規則,常量名沒有所有大寫,這是由於 Java 的發展通過了一段至關長的時間,而命名規範也是逐步造成的,File 類出現較早,因此當時並無對命名規範有嚴格的要求,這些都屬於 Java 的歷史遺留問題。數組

Windows 的路徑分隔符使用反斜線「\」,而 Java 程序中的反斜線表示轉義字符,因此若是須要在 Windows 的路徑下包括反斜線,則應該使用兩條反斜線或直接使用斜線「/」也能夠。Java 程序支持將斜線當成平臺無關的路徑分隔符。ide

假設在 Windows 操做系統中有一文件 D:\javaspace\hello.java,在 Java 中使用的時候,其路徑的寫法應該爲 D:/javaspace/hello.java 或者 D:\javaspace\hello.java。工具

獲取文件屬性

在 Java 中獲取文件屬性信息的第一步是先建立一個 File 類對象並指向一個已存在的文件, 而後調用表 1 中的方法進行操做。
例1:
假設有一個文件位於 C:\windows\notepad.exe。編寫 Java 程序獲取並顯示該文件的長度、是否可寫、最後修改日期以及文件路徑等屬性信息。實現代碼以下:開發工具

public class Test02 {
    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() + "字節");
        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 類構造方法的第一個參數指定文件所在位置,這裏使用C:/做爲文件的實際路徑;第二個參數指定文件名稱。建立的 File 類對象爲 f,而後經過 f 調用方法獲取相應的屬性,最終運行效果以下所示。測試

C:\windows\notepad.exe文件信息以下:
============================================
文件長度:193536字節
文件或者目錄:是文件
文件或者目錄:不是目錄
是否可讀:可讀取
是否可寫:可寫入
是否隱藏:不是隱藏文件
最後修改日期:Mon Dec 28 02:55:19 CST 2016
文件名稱:notepad.exe
文件路徑:C:\windows\notepad.exe
絕對路徑:C:\windows\notepad.exe

> 建立和刪除文件

File 類不只能夠獲取已知文件的屬性信息,還能夠在指定路徑建立文件,以及刪除一個文件。建立文件須要調用 createNewFile() 方法,刪除文件須要調用 delete() 方法。不管是建立仍是刪除文件一般都先調用 exists() 方法判斷文件是否存在。
例 2:
假設要在 C 盤上建立一個 test.txt 文件,程序啓動時會檢測該文件是否存在,若是不存在則建立;若是存在則刪除它再建立。spa

實現代碼以下:操作系統

public class Test03 {
    public static void main(String[] args) throws IOException {
        File f = new File("C:\\test.txt"); // 建立指向文件的File對象
        if (f.exists()) // 判斷文件是否存在
        {
            f.delete(); // 存在則先刪除
        }
        f.createNewFile(); // 再建立
    }
}

運行程序以後能夠發現,在 C 盤中已經建立好了 test.txt 文件。可是若是在不一樣的操做系統中,路徑的分隔符是不同的,例如:code

  • Windows 中使用反斜槓\表示目錄的分隔符。
  • Linux 中使用正斜槓/表示目錄的分隔符。

那麼既然 Java 程序自己具備可移植性的特色,則在編寫路徑時最好能夠根據程序所在的操做系統自動使用符合本地操做系統要求的分隔符,這樣才能達到可移植性的目的。要實現這樣的功能,則就須要使用 File 類中提供的兩個常量。

代碼修改以下:

public static void main(String[] args) throws IOException {
    String path = "C:" + File.separator + "test.txt"; // 拼湊出能夠適應操做系統的路徑
    File f = new File(path);
    if (f.exists()) // 判斷文件是否存在
    {
        f.delete(); // 存在則先刪除
    }
    f.createNewFile(); // 再建立
}

程序的運行結果和前面程序同樣,可是此時的程序能夠在任意的操做系統中使用。

注意:在操做文件時必定要使用 File.separator 表示分隔符。在程序的開發中,每每會使用 Windows 開發環境,由於在 Windows 操做系統中支持的開發工具較多,使用方便,而在程序發佈時每每是直接在 Linux 或其它操做系統上部署,因此這時若是不使用 File.separator,則程序運行就有可能存在問題。關於這一點咱們在之後的開發中必定要有所警戒。

建立和刪除目錄

File 類除了對文件的建立和刪除外,還能夠建立和刪除目錄。建立目錄須要調用 mkdir() 方法,刪除目錄須要調用 delete() 方法。不管是建立仍是刪除目錄均可以調用 exists() 方法判斷目錄是否存在。
例 3
編寫一個程序判斷 C 盤根目錄下是否存在 config 目錄,若是存在則先刪除再建立。實現代碼以下:

public class Test04 {
    public static void main(String[] args) {
        String path = "C:/config/"; // 指定目錄位置
        File f = new File(path); // 建立File對象
        if (f.exists()) {
            f.delete();
        }
        f.mkdir(); // 建立目錄
    }
}public class Test04 {
    public static void main(String[] args) {
        String path = "C:/config/"; // 指定目錄位置
        File f = new File(path); // 建立File對象
        if (f.exists()) {
            f.delete();
        }
        f.mkdir(); // 建立目錄
    }
}

遍歷目錄

經過遍歷目錄能夠在指定的目錄中查找文件,或者顯示全部的文件列表。File 類的 list() 方法提供了遍歷目錄功能,該方法有以下兩種重載形式。
1.String[] list()
該方法表示返回由 File 對象表示目錄中全部文件和子目錄名稱組成的字符串數組,若是調用的 File 對象不是目錄,則返回 null。

提示:list() 方法返回的數組中僅包含文件名稱,而不包含路徑。但不保證所得數組中的相同字符串將以特定順序出現,特別是不保證它們按字母順序出現。
2.String[] list(FilenameFilter filter)
該方法的做用與 list() 方法相同,不一樣的是返回數組中僅包含符合 filter 過濾器的文件和目錄,若是 filter 爲 null,則接受全部名稱。
例 4:
假設要遍歷 C 盤根目錄下的全部文件和目錄,並顯示文件或目錄名稱、類型及大小。使用 list() 方法的實現代碼以下:

public class Test05 {
    public static void main(String[] args) {
        File f = new File("C:/"); // 創建File變量,並設定由f變量變數引用
        System.out.println("文件名稱\t\t文件類型\t\t文件大小");
        System.out.println("===================================================");
        String fileList[] = f.list(); // 調用不帶參數的list()方法
        for (int i = 0; i < fileList.length; i++) { // 遍歷返回的字符數組
            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() + "字節");
        }
    }
}

因爲 list() 方法返回的字符數組中僅包含文件名稱,所以爲了獲取文件類型和大小,必須先轉換爲 File 對象再調用其方法。以下所示的是實例的運行效果:

文件名稱  文件類型  文件大小
===================================================
$Recycle.Bin  文件夾  4096字節
Documents and Settings  文件夾  0字節
Download  文件夾  0字節
DRIVERS  文件夾  0字節
FibocomLog  文件夾  0字節
Gateface  文件夾  0字節
GFPageCache  文件夾  0字節
hiberfil.sys  文件  3375026176字節
Intel  文件夾  0字節
KuGou  文件夾  0字節
logs  文件夾  0字節
msdia80.dll  文件  904704字節
MSOCache  文件夾  0字節
MyDownloads  文件夾  0字節
MyDrivers  文件夾  0字節
news.template  文件  417字節
NVIDIA  文件夾  0字節
OneDriveTemp  文件夾  0字節
opt  文件夾  0字節
pagefile.sys  文件  6442450944字節
PerfLogs  文件夾  0字節
Program Files  文件夾  12288字節
Program Files (x86)  文件夾  8192字節
ProgramData  文件夾  12288字節
QMDownload  文件夾  0字節
Recovery  文件夾  0字節
swapfile.sys  文件  268435456字節
System Volume Information  文件夾  12288字節
Users  文件夾  4096字節
Windows  文件夾  16384字節

例 5:
假設但願只列出目錄下的某些文件,這就須要調用帶過濾器參數的 list() 方法。首先須要建立文件過濾器,該過濾器必須實現 java.io.FilenameFilter 接口,並在 accept() 方法中指定容許的文件類型。

以下所示爲容許 SYS、TXT 和 BAK 格式文件的過濾器實現代碼:

public class ImageFilter implements FilenameFilter {
    // 實現 FilenameFilter 接口
    @Override
    public boolean accept(File dir, String name) {
        // 指定容許的文件類型
        return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");
    }
}public class ImageFilter implements FilenameFilter {
    // 實現 FilenameFilter 接口
    @Override
    public boolean accept(File dir, String name) {
        // 指定容許的文件類型
        return name.endsWith(".sys") || name.endsWith(".txt") || name.endsWith(".bak");
    }
}

上述代碼建立的過濾器名稱爲 ImageFilter,接下來只須要將該名稱傳遞給 list() 方法便可實現篩選文件。以下所示爲修改後的 list() 方法,其餘代碼與例 4 相同,這裏再也不重複。

String fileList[] = f.list(new ImageFilter());

再次運行程序,遍歷結果以下所示:再次運行程序,遍歷結果以下所示:

文件名稱        文件類型        文件大小
===================================================
offline_FtnInfo.txt        文件        296字節
pagefile.sys        文件        8436592640字節
相關文章
相關標籤/搜索