Java的File类(Java基础复习归纳系列)
参考资料:THU 谌*教学PPT
目录
一、文件
什么是文件
-
文件是一种抽象机制,它提供了一种把信息保存在磁盘等存储设备上,并且便于以后访问的方法。
-
在一个操作系统中,负责处理文件相关事宜的部分,称为文件系统。
文件的属性
- 每个文件都有一个名字和它所保存的信息,此外,OS还给每个文件附加了一些其他信息,这些信息称为文件的属性。
-
常见的一些文件属性:
- 只读标志位:可读/写或只读
- 隐藏标志位:普通文件或隐藏文件
- 系统标志位:普通文件或系统文件
- 创建时间、最后访问时间、最后修改时间
- 文件长度
- 文件的创建者、保护信息等
目录
- 目录(directory)也称文件夹(folder),它是一张表格,记录了在该目录下的每一个文件的文件名和其他的一些管理信息。
- 一般情况下,每个文件占用该表格的某一行,即一个目录项;
- 这张表格本身是以文件的形式存放在磁盘上;
- 在目录的管理上,也有相关的系统调用,如:创建目录、删除目录、修改目录名等
目录的实现
二、File类
File类的常用方法
- File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径
- File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File类操作文件或者目录之前,首先得创建一个File对象。创建File对象的构造方法如下所示。
构造方法
File(String pathname) |
通过将给定路径名字符串转换为抽象路径名来创建一个File 实例。 |
File(File parent, String child) |
根据父路径抽象路径名和子路径路径名(包括文件名称)创建一个 File 对象。 |
File(String parent, String child) |
根据父路径名字符串和子路径名(包括文件名称)字符串创建一个 File 对象。 |
File(URI uri) |
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 对象。 |
常用方法
原型 |
功能描述 |
String getName() |
得到文件的名称(不包括路径) |
String getPath() |
得到文件的路径名 |
String getAbsolutePath() |
得到文件的绝对路径名(在 UNIX 系统上,如果路径名的前缀是 "/",那么该路径名是绝对路径名。在Windows系统上,如果路径名的前缀是后跟 "\\" 的盘符,或者是 "\\\\",那么该路径名是绝对路径名)。 |
String getParent() |
得到文件的上一级目录名 |
boolean renameTo(File dest) |
将当前文件名修改为dest |
boolean exists() |
测试当前File对象所指示的文件是否存在 |
boolean canWrite() |
测试文件是否可写 |
boolean canRead() |
测试文件是否可读 |
boolean isFile() |
判断当前文件是否是一个文件(而非目录) |
boolean isDirectory() |
判断当前文件是否是目录 |
boolean createNewFile() |
检查File对象对应的文件是否存在,若不存在则创建该文件。创建成功返回true,否则返回false |
long lastModified() |
得到文件最近一次修改的时间(返回值用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示) |
long length() |
得到文件的长度,以字节为单位 |
boolean delete() |
删除当前文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。成功删除返回true,否则返回false。 |
String[] list() |
列出当前目录下的文件 |
String[] list(FilenameFilter filter) |
返回一个字符串数组,包含此路径中满足指定过滤器的文件和目录 |
File[] listFiles() |
返回一个包含了File对象所有子目录和子文件的File数组 |
File类的应用
1.遍历目录下的文件
例:获取某个目录下指定类型的文件
list(FilenameFilter filter)方法的工作原理如下所示:
a、调用list()方法传入FilenameFilter文件过滤器对象
b、取出当前File对象所代表目录下的所有子目录和文件
c、对于每一个子目录或文件,都会调用文件过滤器对象的accept(File dir,String name)方法,dir - 被找文件所在的目录,name - 文件的名称。
d、如果accept()方法返回true,就将当前遍历的这个子目录或文件添加到数组中,如果返回false,则不添加。
import java.io.*;
public class TestFilenameFilter {
public static void main(String[] args) throws Exception {
// 创建File对象
File file = new File("D:\\");
// 创建过滤器对象
FilenameFilter filter = new FilenameFilter() {
@Override
// 实现accept方法
public boolean accept(File dir, String name) {
File currFile = new File(dir, name);
if (currFile.isFile() && name.endsWith("txt")) {
return true;
} else
return false;
}
};
if (file.exists()) {// 判断File对象对应的目录是否存在
String[] lists = file.list(filter);// 获得过滤后的所有文件名数组
for (String name : lists) {
System.out.println(name);
}
}
}
}
2.删除文件及目录
File类提供了delete()方法删除文件,但该方法无法删除非空目录,因此,要想删除文件及非空目录,需要通过递归的方式将整个目录以及其中的文件全部删除。
例:编写一个方法删除指定目录,不论其是否为空
import java.io.*;
public class DeleteDir {
static int cntFile = 0;
static int cntDir = 0;
public static void main(String[] args) {
File file = new File("D:\\test");
deleteFileDir(file);
System.out.println("删除成功,共删除"+cntFile+"个文件和"+cntDir+"个文件夹");
}
public static void deleteFileDir(File dir) {
if (dir.exists()) {
File[] files = dir.listFiles();//得到File数组
for (File file : files) {//遍历所有的子目录和文件
if (file.isDirectory()) {
deleteFileDir(file);//如果是目录,就递归调用deleteFileDir()
} else {
file.delete();//如果是文件,直接删除
cntFile++;
}
}
// 删除完一个目录的所有文件,就删除这个目录
dir.delete();
cntDir++;
}
}
}
上例中定义了一个删除目录的静态方法deleteDir(),接收一个File类型的参数。在这个方法中,调用listFiles()方法把这个目录下所有的子目录和文件保存到一个File类型的数组files中,然后遍历files,如果是目录就重新调用deleteDir()方法进行递归,如果是文件就直接调用File的delete()方法删除。当删除完一个目录下的所有文件后,再删除当前这个目录,这样便从里层到外层递归的删除了整个目录
上一篇: [模板] 可持久化数组