探究java IO之File類

儘管java.io定義的大多數類用於操做流,但File類卻不是。File類直接處理文件文件系統。也就是說,File類沒有指定如何從文件檢索信息以及如何向文件中存儲信息,而是描述了文件自己的屬性。File對象用於獲取和操做與磁盤文件關聯的信息,例如權限,時間日期以及目錄路徑,而且還能夠瀏覽子目錄層次。
java

注意:由JDK7NIO系統增長的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使用介於UNIXWindows約定之間的路徑分隔符。若是在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()方法,該方法建立目錄及其全部父目錄

相關文章
相關標籤/搜索