在IO流的学习过程中,我们经常会对文件的内容进行读取和写入操作,而平时运行一些应用程序时,也经常会对文件本身进行一些操作,诸如新建或删除一个文件,查询文件大小等等。
针对文件的这类操作,JDK中提供了一个File类,该类封装了一个路径,并提供了一系列用于操作该路径下文件的方法。下面我们直接通过代码来了解FIle类的几个常用的方法。
一、 常用方法
我们先在当前工程目录下创建一个file文件夹,在该文件夹下创建一个hello.txt文件并输入“hello中国”,然后运行以下代码:
package com.liao.IOTest0820;
import java.io.File;
public class FileMethods {
public static void main(String[] args) {
// 通过相对路径创建一个file文件
File file = new File("file\\hello.txt");
// 获取文件名称
System.out.println("文件名称:" + file.getName());
// 获取文件目录(父路径)
System.out.println("文件父路径:" + file.getParent());
// 获取文件相对路径
System.out.println("文件相对路径:" + file.getPath());
// 获取文件绝对路径
System.out.println("文件绝对路径:" + file.getAbsolutePath());
// 获取文件大小(byte)
System.out.println("文件大小:" + file.length());
// 判断文件是否存在
System.out.println("文件是否存在:" + file.exists());
// 判断是否为文件
System.out.println("是否为一个文件:" + file.isFile());
// 判断是否为目录
System.out.println("是否为一个目录:" + file.isDirectory());
// 判断是否为绝对路径
System.out.println("是否为绝对路径:" + file.isAbsolute());
// 判断文件是否可读
System.out.println("是否可读:" + file.canRead());
// 判断文件是否可写
System.out.println("是否可写:" + file.canWrite());
// 获取文件最后修改时间(距时间戳的毫秒数)
System.out.println("最后修改时间:" + file.lastModified());
}
}
执行上述代码,得到输出结果如下:
通过上述方法,我们可以获取该文件的一些基本有用信息。下面,我们再了解一下文件目录的遍历。
二、 遍历目录下的文件
这里我们重点了解两个方法:list( )和listfiles( ):
list( )方法: 返回一个字符串数组(String [ ]),这些字符串表示目录下的文件和目录名,
listfiles( )方法: 返回一个抽象路径名数组(File [ ]),这些路径名表示此目录下的文件。
值得注意的是,遍历一个文件目录之前,我们最好先调用File类的isDirectory()方法对该路径下的文件进行一个判断,如果是目录的话,我们再调用list()方法;如果是文件的话,调用list()方法会报空指针异常。
三、 文件过滤器
通过调用list( )方法,我们可以获得一个目录下的所有文件,但有时候我们仅仅需要得到特定类型的文件,如txt文件,class文件等等,这时我们就需要用到文件过滤器,用来获得指定类型的文件。
针对这种需求,java 里提供了一个重载了的list(FilenameFilter filter)的方法,该方法接收一个FilenameFilter 类型的参数。FilenameFilter 是一个接口,被称作文件过滤器,其中定义了一个抽象方法accept(File dir ,String name )。
当我们调用list(FilenameFilter filter)方法时,就需要实现FilenameFilter接口,并对accept( )方法进行重写,通过 accept()方法指定文件类型,从而文件过滤目的。
值得注意的是,accept( )方法的返回值类型为boolean类型,如果返回结果为true,则该文件将会被加入到数组中,如果为false,则不添加。
四、 文件(目录)的删除
File类中提供了一个文件删除的方法delete(),通过调用delete()方法可以对文件或目录进行删除操作。不过,有一点值得注意,如果一个目录不为空(存在子目录或文件),则delete()操作无效。这时需要先删除该目录下所有文件(子目录),然后才能删除该目录。
下面我们通过一个简单的例子来加深对上述三种操作的认识。
package com.liao.IOTest0820;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileOperate {
private static FilenameFilter filter;
public static void main(String[] args) {
// 创建文件夹
File parentFile = new File("fileTest");
// 文件夹不存在则新建文件夹
if (!parentFile.exists()) {
parentFile.mkdir();
}
// 生成txt文件
creatFile(".txt");
//生成java文件
creatFile(".java");
// 文件过滤器
filter = new FilenameFilter() {
//重写accept( )方法
@Override
public boolean accept(File dir, String name) {
//创建File对象
File file = new File(dir, name);
//判断是否为后缀名为.java的文件
if (file.isFile() && name.endsWith(".java")) {
return true;
} else {
return false;
}
}
};
// 输出所有.java文件
String[] names = parentFile.list(filter);
for (String name : names) {
System.out.println(name);
}
// 删除文件及目录
deleteFile(parentFile);
}
//文件生成方法,接收一个文件类型参数
private static void creatFile(String type) {
for (int i = 0; i < 5; i++) {
String name = "fileTest\\" + i + type;
File file = new File(name);
//判断文件是否存在
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static void deleteFile(File dir) {
if (dir.exists()) {// 文件是否存在
// 获取文件目录
File[] files = dir.listFiles(filter);
// 遍历文件
for (File file : files) {
// 判断是否为文件夹
if (file.isDirectory()) {
//如果为文件夹,递归调用deleteFile()方法
deleteFile(file);
} else {
//删除文件
file.delete();
}
}
}
}
}
通过上面的学习,我们对File类有了一些基本的认识,小结如下:
1、获取文件基本信息,如文件名,路径,大小等,这里需重点注意一下相对路径与绝对路径;
2、遍历目录下的文件,list( )和listfiles( ),使用前注意先判断是否为目录;
3、文件过滤器,实现list()方法下的FilenameFilter接口,重写accept()方法;
4、文件(目录)的删除,调用delete()方法,注意删除非空目录时须先删除该目录下所有文件。