程序除了處理內存中的數據結構,還要操做磁盤上的各種文件,這裏的磁盤是個統稱,泛指能夠持久保留數據的存儲介質,包括但不限於:插在軟驅中的軟盤、固定在機箱中的硬盤、插在光驅中的光盤、插在USB接口上的U盤、筆記本電腦裏的固態盤、手機中的閃存、相機裏的SD卡等等。固然,操做系統層面已經統一了這些存儲介質,故而編程語言無須理會它們之間的區別,只需專心訪問存儲介質上保存的文件。爲表述方便,接下來將用「磁盤」二字代指以上羅列的各類存儲介質。
Java使用File工具來操做磁盤文件,只要在構造方法中填寫某文件的完整路徑,便可經過建立好的文件對象進行各項處理。相關的處理方法主要有四大類:檢查文件狀態、獲取文件信息、管理文件操做、遍歷某目錄下的文件,分別說明以下。html
一、檢查文件狀態
File工具既可操做某個文件,也可操做某個目錄。狹義的文件專指一個單獨的數據文件,廣義的文件則將目錄(或稱文件夾)也包括在內。下面是檢查文件狀態的相關方法描述。
exists:判斷當前文件/目錄是否存在,存在返回true,不存在返回false。
canExecute:判斷當前文件是否容許執行,容許返回true,不容許返回false。
canRead:判斷當前文件是否容許讀取,容許返回true,不容許返回false。
canWrite:判斷當前文件是否容許寫入,容許返回true,不容許返回false。
isHidden:判斷當前文件/目錄是否隱藏,隱藏返回true,沒隱藏返回false。
isDirectory:判斷當前是否爲目錄,是返回true,否返回false。
isFile:判斷當前是否爲文件,是返回true,否返回false。java
二、獲取文件信息
只要磁盤中存在某個文件/目錄,就能調用相關方法獲取該文件/目錄的基本信息,這些方法說明以下:
getAbsolutePath:獲取當前文件/目錄的絕對路徑。
getPath:獲取當前文件/目錄的相對路徑。
getName:若是當前爲文件,則返回文件名稱;若是當前爲目錄,則返回目錄名稱。
getParent:獲取當前文件/目錄的上級目錄路徑。
length:若是當前爲文件,則返回文件大小;若是當前爲空目錄,則返回0;若是當前目錄非空,則返回該目錄的索引空間大小,索引保存了目錄內部的文件基本信息。
lastModified:獲取當前文件/目錄的最後修改時間,單位毫秒。編程
三、管理文件操做
除了獲取文件狀態和信息,還能對文件進行建立、刪除、改名等管理操做,具體方法列舉以下:
mkdir:只建立最後一級目錄,若是上級目錄不存在就返回false。
mkdirs:建立文件路徑中全部不存在的目錄。
createNewFile:建立新文件。若是文件路徑中的目錄不存在,就會扔出異常IOException。
delete:刪除文件,也可刪除空目錄,但不可刪除非空目錄。在刪除非空目錄時會返回false。
renameTo:文件重命名,把源文件的名稱改成目標名稱。數組
四、遍歷某目錄下的文件
最後是提供給目錄專用的文件遍歷操做,主要的遍歷方法有list和listFiles兩個,其中前者返回的是String類型的文件路徑數組,後者返回的是Fille類型的文件路徑數組。另外,listFiles方法包括了三個同名的重載方法,它們之間根據參數類型區分開,詳細的用法區別見下:
第一個重載的listFiles方法沒有輸入參數,它返回當前目錄下的全部文件和目錄。第二個重載的listFiles方法擁有一個FileFilter類型的輸入參數,用於根據文件信息篩選符合條件的文件和目錄。第三個重載的listFiles方法擁有一個FilenameFilter類型的輸入參數,用於根據文件信息和文件名稱篩選符合條件的文件和目錄。注意FileFilter與FilenameFilter都屬於函數式接口,因此它們的實例能夠採用Lambda表達式來改寫。下面各舉一個例子加以說明。
首先利用FileFilter接口查找某個目錄下的全部隱藏子目錄,常規的過濾代碼示例以下:數據結構
File path = new File(mPath); // 建立一個指定路徑的文件對象 File[] hiddens; // 匿名內部類的寫法。經過文件過濾器FileFilter來篩選文件 hiddens = path.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isHidden(); // 是隱藏文件 } });
可見以上的匿名內部類代碼明顯繁瑣,鑑於函數式接口的特性,徹底能夠將代碼使用Lambda表達式精簡,簡化後的過濾代碼只有下面區區一行:編程語言
// Lambda表達式的寫法 hiddens = path.listFiles(file -> file.isHidden());
因爲上述的Lambda表達式代碼符合參數方法引用的規則,所以還能採起方法引用的格式改寫以下:ide
// 方法引用的寫法 hiddens = path.listFiles(File::isHidden);
真是想不到,方法引用的地盤都擴張到文件查找這邊了。函數
再看看FilenameFilter接口,該接口比起FileFilter多了個文件名稱,於是常常用於過濾特定擴展名的文件。好比文本文件的擴展名爲「.txt」,檢查文件是否以「.txt」結尾便可判斷它是否爲文本文件。仍舊從形態完整的匿名內部類寫法着手,此時篩選文本文件的常規代碼示例以下:工具
File path = new File(mPath); File[] txts; // 匿名內部類的寫法。經過文件名稱過濾器FilenameFilter來篩選文件 txts = path.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); // 文件擴展名爲txt } });
一樣採起Lambda表達式精簡上面的匿名內部類代碼,簡寫後的篩選代碼只有如下一行:spa
// Lambda表達式的寫法 txts = path.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
更多Java技術文章參見《Java開發筆記(序)章節目錄》