儘管java.io定義的大多數類用於操做流,但File類卻不是。File類直接處理文件和文件系統。也就是說,File類沒有指定如何從文件檢索信息以及如何向文件中存儲信息,而是描述了文件自己的屬性。File對象用於獲取和操做與磁盤文件關聯的信息,例如權限,時間日期以及目錄路徑,而且還能夠瀏覽子目錄層次。
java
注意:由JDK7爲NIO系統增長的Path接口和File類,在許多狀況下都爲File類提供了強大的替換方案,具體看後面的NIO章節。apache
下面的構造函數能夠用於建立File對象:數組
File(String directoryPath) File(String directoryPath,String filename) File(File dirObj,String filename) File(URI uriObj)
其中,directoryPath是文件的路徑名;filename是文件或子目錄的名稱; dirObj是指定目錄的File對象;uriObj是描述文件的URI對象。函數
注意:Java使用介於UNIX和Windows約定之間的路徑分隔符。若是在Windows版本的Java中使用正斜槓(/),那麼路徑仍然會被正確解析。請記住,若是使用Windows約定的反斜槓(\),那麼在字符串中須要使用轉義序列(\\)。this
咱們來看看File調用的示例:spa
package io; import java.io.File; public class FileDemo { public static void main(String[] args) { File f1 = new File("/home/fuhd/apache/apr-1.5.1.tar.gz"); //返回文件名 System.out.println("File name:" + f1.getName()); //返回文件路徑 System.out.println("Path:" + f1.getPath()); //返回絕對路徑 System.out.println("Abs Path:" + f1.getAbsolutePath()); //返回父目錄路徑 System.out.println("Parent:" + f1.getParent()); //是否存在 System.out.println(f1.exists() ? "exists" : "does not exist"); //是否有權限寫 System.out.println(f1.canWrite() ? "is writeable" : "is not writeable"); //有否有權限讀 System.out.println(f1.canRead() ? "is readable" : "is not readable"); //是不是文件 System.out.println(f1.isFile() ? "is normal file" : "might be a maned pipe"); //是否有絕對路徑 System.out.println(f1.isAbsolute() ? "is absolute" : "is not absolute"); //文件最後修改時間 System.out.println("File last modified:" + f1.lastModified()); //文件大小 System.out.println("File size:" + f1.length() + " Bytes"); } }
File類還提供了兩個有用的實用方法。第一個方法是renameTo(),以下所示:code
boolean renameTo(File newName)
其中,由newName指定的文件名成爲調用File對象的新名稱。若是操做成功,就返回true,若是文件不能被重命令就返回false。第二個實用方法是delete(),該方法刪除調用File對象的路徑所表明的磁盤文件。該方法以下:orm
boolean delete()
若是目錄爲空的話,可使用delete()方法刪除這個目錄。若是刪除成功,delete()方法將返回true;若是不能刪除文件,就返回false。對象
JDK7爲File類新增了方法 toPath(),該方法以下所示:接口
Path toPath()
toPath()方法返回的Path對象表示由調用File對象封裝的文件(換句話說,toPath()方法能夠將File對象轉換成Path對象)。Path是由JDK7新添加的接口。該接口被打包到java.nio.file包中,是NIO組成部分。所以,toPath()方法在舊的File類和新的Path接口之間搭建了一所橋樑。(固然,以上的方法都不是File類的所有,這裏只是作了部分介紹而已)
目錄
目錄是包含一系列其餘文件和目錄的File對象。當爲目錄建立File對象時,isDirectory()方法將會返回true。在這種狀況下,能夠對File對象調用list()方法以提取內部的其餘文件和目錄列表。如例:
package io; import java.io.File; public class DirList { public static void main(String[] args) { String dir = "/home/fuhd/apache"; File file = new File(dir); if(file.isDirectory()){ String[] fileList = file.list(); if(fileList != null && fileList.length > 0){ for(String f1 : fileList){ System.out.println("文件名:" + f1); } } } } }
使用FilenameFilter接口
常常會但願限制list()方法返回的文件數量,使返回結果只包含匹配特定模式(或稱爲過濾器)的那些文件。爲此,必須使用list()方法的第二種形式:String[] list(FilenameFilter ffobj,在這種形式中,ffobj是實現了FilenameFilter接口的類的對象。FilenameFilter接口只定義了方法accept(),該方法針對列表中的每一個文件調用一次,通常形式以下所示:boolean accept(File directory,String filename),在由directory指定的目錄中,對於那些應當被包含到列表中的文件(也就是那些能匹配filename參數的文件),accept()方法返回true;對於那些應當排除的文件,accept()方法返回false。
package io; import java.io.File; import java.io.FilenameFilter; public class DirListOnly { public static void main(String[] args) { String d = "/home/fuhd/apache"; File f = new File(d); FilenameFilter filter = new OnlyExt("tar.gz"); String[] files = f.list(filter); for(String fileName : files){ System.out.println(fileName); } } } class OnlyExt implements FilenameFilter { String ext; public OnlyExt(String ext) { this.ext = "." + ext; } public boolean accept(File dir,String name){ return name.endsWith(ext); } }
listFiles()方法
list()方法還有一種形式,稱爲listFiles(),你可能會發現該方法頗有用。listFiles()方法的簽名以下:
File[] listFiles() File[] listFiles(FilenameFilter ffobj) File[] listFiles(FileFilter fobj)
這些方法將文件列表做爲File對象而不是字符串數組返回。第1個方法返回全部文件,第2個方法返回那些知足指定的FilenameFilter的文件。除了返回的是File對象數組以外,就工做方法而言,這兩個版本的listFiles()方法和它們等價的list()方法相似。第3個版本的listFiles()方法返回那些路徑名稱能知足指定的FileFilter文件。FileFilter只定義了方法accept(),該方法針對列表中的每一個文件調用一次,通常形式以下:
boolean accept(File path)
對於應當包含到列表中的文件(也就是那些能匹配path參數的文件),該方法返回 true;對於那些應當排除的文件,該方法返回false。
建立目錄
File類提供的另外兩個有用的實用方法是mkdir()和mkdirs()。mkdir()方法用來建立目錄,若是成功,就返回true;不然返回false;要爲不存在的路徑建立目錄,可使用mkdirs()方法,該方法建立目錄及其全部父目錄。