File 类
在进行文件操作时,需要知道一些关于文件的信息。 File 类提供给了一些方法来操纵文件 和获取文件的信息。对于目录, Java 把它当做一种特殊类型的文件,即文件名单列表。
File 类直接处理文件和文件系统。 通过 File 类的方法,可以得到文件或者目录的描述信息,包括名称, 所在路径, 读写性, 长度等。还可以创建目录,创建文件,改变文件名,删除文件,列出目录中的文件等。
File 类的声明如下:
public class File extends Object implements Serializable
构造方法:
File(String path);
File(String dir, String filename);
File(File dir, String filename);
File(URI uri);
其中 ,dir 是文件所在的目录,filename 是文件名,path 是文件的路径名。
File f1 = new File("D:/Java");
File f2 = new File("D:/Java", "test.txt");
File f3 = new File(f1,"test.txt");
File f4 = new File("file://D:/Java/test.txt");
注意: Java 能正确处理 Unix 和 Windows/Dos 约定的路径分隔。 如果在Windows 版本的 Java 下用斜线(/),路径处理依然正确。 记住,如果在 Windows/Dos 系统中使用反斜线(\)则需要在字符串内使用它的转义序列(\)Java 约定用 UNIX 和 URL 风格的斜线来作路径分隔符。
File 定义了很多获取 File 对象标准属性的方法。 例如:getName() 返回文件名,getParent() 返回父目录名, exists() 在文件存在的情况下返回 true, 否则返回 false.
File 类提供的方法:
创建一个文件对象后, 可以用 File 类提供的方法来获得文件相关信息,对文件进行操作。
方法 | 描述 |
---|---|
boolean canRead() | 测试文件是否可读 |
boolean canWrite() | 测试文件是否可写 |
int compareTo(File pathname) | 比较两个文件的名称 |
boolean createNewFile() | 创建文件 |
static File createTempFile(String prefix, String suffix) | 在默认的临时文件目录创建一些空文件 |
boolean delte() | 删除文件 |
void deleteOnExit() | 在 Java 虚拟终端机终止时删除与调用对象相关的文件 |
boolean equals(Object obj) | 比较两个文件对象 |
boolean exists() | 测试文件是否存在 |
File getAbsoluteFile() | 返回绝对文件名 |
String getAbsolutePath() | 返回绝对路径 |
String getCanonicalPath() | 返回规范的路径字符串 |
String getName() | 返回文件名(不包括路径) |
String getParent() | 返回父目录 |
String getPath() | 返回路径 |
boolean isAbsolute() | 是否为绝对路径 |
boolean isDirectory() | 是否为目录 |
boolean isFile() | 是否为文件 |
boolean isHidden() | 是否隐藏文件 |
long lastModified() | 上次修改时间,从 1970 年 1 月 1 日 开始的标准时间的毫秒数 |
long length() | 文件长度 |
String[] list() | 列出目录中的文件 |
String[] list(FilenameFilter filter) | 使用过滤器列出目录中的文件 |
static File[] listRoots() | 列出所有的根目录 |
boolean mkdir() | 创建目录 |
boolean mkdirs() | 创建多层目录 |
boolean renameTo(File dest) | 重命名文件 |
boolean setLastModified(long time) | 设置上次修改时间 |
boolean setReadOnly() | 设置为只读 |
String toString() | 把文件对象转化成字符串 |
URi toURI() | 把文件对象转化成 URI 对象 |
URL toURL() | 把文件对象转化成 URL 对象 |
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException{
System.out.println("path separator: "+ File.pathSeparator);
System.out.println("path separator char: "+ File.pathSeparator);
System.out.println("separator: "+ File.separator);
System.out.println("separator char: "+ File.separatorChar);
File dir = new File("D:\\JAVA\\Java File");
File f = new File(dir, "FileDemo.class");
File path = new File("D:\\JAVA\\Java File\\FileDemo.class");
File f2 = new File("file:\\D:\\JAVA\\Java%20File\\FileDemo.class");
System.out.println("");
System.out.println(f);
System.out.println("exist: " + f.exists());
System.out.println("name: " + f.getName());
System.out.println("path: " + f.getPath());
System.out.println("absolute path: " + f.getAbsolutePath());
System.out.println("parent: " + f.getParent());
System.out.println("is a file: " + f.isFile());
System.out.println("is a dir: " + f.isDirectory());
System.out.println("length: " + f.length());
System.out.println("can read: " + f.canRead());
System.out.println("can write: " + f.canWrite());
System.out.println("last Modified: " + f.lastModified());
f.setLastModified(f.lastModified() + 1102304);
System.out.println("last Modified: " + f.lastModified());
System.out.println("Canonical Path: " + f.getCanonicalPath());
File newF = new File("newFile.class");
System.out.println("----Rename " + f + " ------");
f.renameTo(newF);
System.out.println("name: " + newF.getName());
System.out.println(f + " exist? " + f.exists());
System.out.println(newF +" exist? " + f.exists());
System.out.println("convert to URI" + f.toURI());
System.out.println("compare f to path:" + f.compareTo(path));
System.out.println("compare f to f2:" + f.compareTo(f2));
System.out.println("---- delete "+ newF + " ------");
newF.delete();
System.out.println(newF + " exist? "+ newF.exists());
}
}
// path separator: ;
// path separator char: ;
// separator: \
// separator char: \
// D:\JAVA\Java File\FileDemo.class
// exist: true
// name: FileDemo.class
// path: D:\JAVA\Java File\FileDemo.class
// absolute path: D:\JAVA\Java File\FileDemo.class
// parent: D:\JAVA\Java File
// is a file: true
// is a dir: false
// length: 0
// can read: true
// can write: true
// last Modified: 1531019202728
// last Modified: 1531020305032
// Canonical Path: D:\JAVA\Java File\FileDemo.class
// ----Rename D:\JAVA\Java File\FileDemo.class ------
// name: newFile.class
// D:\JAVA\Java File\FileDemo.class exist? true
// newFile.class exist? true
// convert to URIfile:/D:/JAVA/Java%20File/FileDemo.class
// compare f to path:0
// compare f to f2:-2
// ---- delete newFile.class ------
// newFile.class exist? false
目录
目录是一个包含其他文件和路径列表的 File 类。当创建一个 File 对象 且 它是 目录时,则 isDirectory() 方法返回 true 。 在这种情况下, 可以调用该对象的 list() 方法来提取该目录内部其他文件和目录的列表 。 该方法有两种形式:
第一种:文件名列表在一个 String 对象的数组中返回
String[] list();
第二种:文件对象列表在 一个 File 对象的数组中返回。
File[] listFiles();
有时 需要列出目录下制定类型的文件,比如. java、.class 等扩展名的文件。可以使用 File 类的 下述 3 个方法,列出制定类型的文件。
String[] list(FilenameFilter FFObj);
File[] listFiles(FilenameFilter FFObj);
file[] listFiles(FileFilter FObj);
第一种方法用 字符串形式返回目录下指定类型的文件;
第二种方法用 File 对象数组 的形式 返回目录下的指定类型的文件;
第三种方法也是用 File 对象数组的形式返回目录下的指定类型的文件,和第二种方法不同的是,其参数类型不同。
参数 FFObj 是一个实现 FilenameFilter 接口的类的对象。
FilenameFilter 仅定义了一个方法,即 accept(). 调用 list 方法 列出文件时,将调用 accept() 方法检查该文件名称是否符合 accept 方法指定的名字要求。其一般形式如下:
boolean accept(File directory, String filename);
如果 返回 true ,则名称为 filename 的文件包含在 返回列表中; 反之,不包含在返回列表中。
FObj 是一个实现了 FileFilter 接口的类的对象。 FileFilter 只定义了一个 accept() 方法,该方法针对目录中的每一个文件调用一次,它不仅可以根据文件名过滤文件,也可以根据文件的其他信息过滤文件。 其一般形式如下:
boolean accept(File path);
如果 返回值是 true,则 path 代表的文件包含在返回列表中;反之,不包含在返回列表中。
import java.io.File;
import java.io.FileFilter;
public class FileDemo {
public static void main(String[] args) {
File dir = new File("D:\\JAVA\\Java File");
System.out.println("列出目录 " + dir + " 中的 class 文件:");
Filter filter = new Filter("class");
File fs1[] = dir.listFiles(filter);
display(fs1);
System.out.println("列出目录 " + dir + "中的 子目录");
DirFilter filter2 = new DirFilter();
File fs2[] = dir.listFiles(filter2);
display(fs2);
// 创建一个子目录:
File f = new File(fs2[0].getPath() + "_newDir");
System.out.println(f.mkdir());
File fs3[] = dir.listFiles(filter2);
display(fs3);
}
public static void display(File[] fs){
for (int i = 0; i< fs.length; i++){
if(fs[i].isDirectory()){
System.out.println("目录:" + fs[i]);
}else{
System.out.println("文件:" + fs[i]);
}
}
System.out.println(" ");
}
}
public class Filter implements FilenameFilter{
String extent;
Filter( String extent){
this.extent = extent;
}
public boolean accept(File dir, String name){
return name.endsWith("." + extent);
}
}
public class DirFilter implements FileFilter {
public boolean accept(File path){
return path.isDirectory();
}
}
// 列出目录 D:\JAVA\Java File 中的 class 文件:
// 文件:D:\JAVA\Java File\Exam.class
// 文件:D:\JAVA\Java File\FileDemo.class
// 文件:D:\JAVA\Java File\Graph.class
// 列出目录 D:\JAVA\Java File中的 子目录
// 目录:D:\JAVA\Java File\class
// 目录:D:\JAVA\Java File\class_newDir
// 目录:D:\JAVA\Java File\history
// 目录:D:\JAVA\Java File\src
// false
// 目录:D:\JAVA\Java File\class
// 目录:D:\JAVA\Java File\class_newDir
// 目录:D:\JAVA\Java File\history
// 目录:D:\JAVA\Java File\src