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