探究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()方法,该方法建立目录及其全部父目录

相关文章
相关标签/搜索