Java I/O系統
File類
File類的直接父類是Object類。
一個File類的對象,表示了磁盤上的文件或目錄。
File類提供了與平台無關的方法來對磁盤上的文件或目錄進行操作。因為不同的系統平台對文件路徑的描述不盡相同,所以為了做到平台無關,在Java語言中,使用抽象路徑等概念。Java自動進行不同系統平台的文件路徑描述與抽象文件路徑之間的轉換。
File類直接處理文件和文件系統。
File類沒有指定信息怎樣從文件讀取或向文件存儲。
File類描述了文件本身的屬性。(讀寫屬性等)。
File對象用來獲取或處理與磁盤文件相關的信息,例如權限,時間,日期和目錄路徑。
File類還可以瀏覽子目錄層次結構。
File類的構造函數
File類有四個構造函數:
File(String pathname)
File(File parent, String child)
File(String parent, String child)
File(URI uri)
利用構造方法,指定路徑名、文件名等來構造File類的對象,之后調用該對象的createNewFile()方法就可以創建出相應的文件。
parent指定路徑(父目錄),可以是File類對象也可以是字符串,child中也可以加入路徑層級,但要注意,所用的路徑必須存在,不存在的路徑不會新建。
關於斜杠和反斜杠,只能如下生硬地先記住吧:
\\:右手用兩個,比如new File("D:\\abc\\" + "Test.txt");
/:左手用一個。比如new File("D:/abc/" + "Test.txt");
一個File類對象既可以表示目錄也可以表示文件。
有兩個函數用於判斷File類的對象到底表示什么:
public boolean isDirectory()
public boolean isFile()
它們的名稱和返回值都很顯然,就不多做解釋了。
目錄管理
目錄操作的主要方法為:
public boolean mkdir()
public boolean mkdirs()
根據抽象路徑名創建目錄。它們倆的區別下面會做解釋。
public String[] list()
返回抽象路徑名表示目錄下的文件名和目錄名。
public File[] listFiles()
返回抽象路徑名下的所有文件。與list()方法的不同之處在於一個返回的是字符串,另一個返回的是File類對象。
前面提到File類對象既可以是文件也可以是目錄,創建文件是createNewFile()方法,相對應的,創建目錄即調用mkdir()方法。
注意mkdir()方法使用時只能新建一個文件夾,如下程序:
public class FileTest2 { public static void main(String[] args) { File file = new File("D:/abc/xyz/hello"); file.mkdir(); } }
假設D盤下abc目錄已經存在,但xyz目錄不存在,則不能成功創建hello目錄。
要用mkdir()創建目錄,必須上一級目錄存在,即最底層目錄前面的目錄全都存在。
要想把File對象包含的目錄一次性全都創建好,可以使用mkdirs()方法。
如果目錄已經存在,不用創建,則返回false。
注意mkdirs()方法即便返回false,也可能新創建了一些必要的父目錄。
文件管理
在進行文件操作時,常需要知道一個關於文件的信息。
Java的File類提供了方法來操縱文件和獲得一個文件的信息。如getName()返回文件名,getParent()返回父目錄名,exists()測試文件或目錄是否存在。
然而,File類是不對稱的,說它不對稱,意思是雖然存在允許驗證一個簡單文件對象屬性的很多方法,但是沒有響應的方法來修改這些屬性,即有get無set。
另外,File類還可以對目錄和文件進行刪除、屬性修改等工作。方法名都比較直觀,在此不多做介紹了。
使用FilenameFilter
希望能夠限制由list()方法返回的文件,使它僅返回那些與一定的文件名方式或者過濾器(filter)相匹配的文件。
為達到這樣的目的,必須使用list()方法的帶參數的重載形式:
public String[] list(FilenameFilter filter)
在該形式中,filter是一個實現了FilenameFilter接口的類的對象。
該接口中有一個accept()方法,只有該方法判斷為true的文件名會被list方法返回。所以可以在accept方法中設置篩選規則。(這里使用了策略模式,可以回想一下Java集合中的比較器)。
在此直接放出程序實例,來查看指定目錄下的文件:
文件名顯示程序
import java.io.File; import java.io.FilenameFilter; public class FileTest4 { public static void main(String[] args) { File file = new File("D:/abc"); String[] names = file.list(); // 列出所有文件及路徑 for (String name : names) { System.out.println(name); } System.out.println("-----------------------"); System.out.println("-------所有文件名為.java結尾的文件-----------"); // 選擇.java結尾的文件 for (String name : names) { if (name.endsWith(".java")) { System.out.println(name); } } // 使用文件過濾器 String[] selectedNames = file.list(new FilenameFilter() { // 匿名內部類實現了FilenameFilter接口 // 實現接口中的方法 @Override public boolean accept(File dir, String name) { if (name.endsWith(".java")) { return true; } return false; } }); // 只有accept返回true的文件名會被返回到selectedNames數組中 System.out.println("-----------------------"); System.out.println("-------所有文件名為.java結尾的文件-----------"); for (String name : selectedNames) { System.out.println(name); } } }
參考資料
張龍老師Java SE系列視頻教程。
File類官方文檔:
http://docs.oracle.com/javase/7/docs/api/java/io/File.html
