File类
概述
针对文件的操作,JDK提供了一个File类,该类封装了一个路径,提供了一系列方法用于操作该路径指向的文件。
File类封装的路径可以是相对当前文件夹的相对路径,也可是从系统盘符开始的绝对路径。
注意:
windows系统下,路径名的分隔符必须用"\\"转义。
File类常用构造方法
| 方法 | 描述 |
|---|---|
| File(String pathname) | 通过指定的一个字符串类型的文件路径创建一个新的File对象 |
| File(String parent,String child) | 根据指定的一个字符串型父路径和字符串型子路径(包含文件名称)创建一个File对象 |
| File(File parent,String child) | 根据指定的File类父路径和字符串型子路径(包含文件名)创建一个File对象 |
File类常用方法
| 方法 | 描述 |
|---|---|
| boolean exists() | 判断File对象对应的文件或目录是否存在,存在返回true |
| boolean delete() | 删除File对象对应的文件或目录,成功删除返回true |
| boolean createNewFile() | 当File对象对应的文件不存在时,该方法将新建一个文件,创建成功返回true |
| String getName() | 返回file对象表示的文件名或文件夹名称 |
| String getPath() | 返回File对象对应的路径 |
| String getAbsolutePath() | 返回File对象的绝对路径 |
| String getParent() | 返回File对象对应目录的父目录(即返回的目录不包含最后一级目录) |
| boolean canRead() | 判断File对象对应的文件或目录是否可读 |
| boolean canWrite() | 判断File对象对应的文件或目录是否可写 |
| boolean isFile() | 判断File对象对应的是否是文件 |
| boolean isDirectory() | 判断File对象对应的是否是目录 |
| boolean isAbsolute() | 判断File对象对应的文件或目录是否是绝对路径 |
| long lastModified() | 返回1970年1月1日0时0分0秒到文件最后修改时间的毫秒值 |
| long length() | 返回文件大小,单位:字节 |
| String[] list() | 列出指定目录的全部内容,只是列出名称 |
| File[] listFiles() | 返回一个包含了File对象所有子文件和子目录的File数组 |
| boolean mkdir() | 创建此对象的路径名指定的目录 |
| boolean mkdirs() | 创建此对象路径指定的目录,包含任何必需但不存在的父目录。 |
注意:
跨平台分隔符不同,建议使用File.pathSeparator,File.separator做路径分隔符和目录分隔符。
File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。
File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。
遍历目录下的文件
首先我们在D盘中创建一个临时文件夹,在文件夹中再添加一个文件夹,我们想要遍历临时文件夹中所有的内容,代码如下:
public static void main(String[] args){
//创建文件对象
File file = new File("D:\\临时文件夹");
//如果该文件是文件夹
if (file.isDirectory()) {
//调用list()方法获得该目录下所有文件的名称
String[] names = file.list();
//foreach循环,依次取出字符串数组names的值
for (String name:names){
System.out.println(name);
}
}
}
文件过滤器
有时我们需要得到的是指定类型的文件,例如获取所有".java"文件。针对这种需求,File类中提供重载方法list(FilenameFilter filter)方法,该方法接收一个FilenameFilter类型的参数。FilenameFilter是一个接口,在调用list()方法时,需要实现文件过滤器FilenameFilter,并在accept()方法中做出判断,从而获得指定类型的文件。
下面我们通过案例演示如何遍历指定目录下所有扩展名为".txt"的文件:
public static void main(String[] args) {
//创建文件对象
File file = new File("D:\\临时文件夹\\测试");
//创建过滤器FilenameFilter对象,实现accept方法
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File currFile = new File(dir, name);
if (currFile.isFile() && name.endsWith(".docx")) {
return true;
}
return false;
}
};
//如果文件对象存在
if (file.exists()) {
String[] lists = file.list(filter);
for (String name : lists) {
System.out.println(name);
}
}
}
为了让小伙伴们更容易理解过滤器的原理,下面分步骤分析:
- 取出File对象指定目录下的所有子目录和文件。
- 对于每个子目录或文件,都会调用accept(File dir,String name)方法。
- accept方法中新建一个File对象,将accept方法的参数传入创建File对象的构造方法中。
- 对currFile对象进行判断,如果返回true,将当前遍历的子目录或文件添加到字符串数组中。
通过递归遍历子目录下的文件
上述两个例子,我们只能遍历特定目录下的子目录和文件,如果我们想要遍历子目录中的文件,就需要使用递归。
递归方法代码如下:
public static void fileDir(File dir){
if (dir.isDirectory()){
File[] files = dir.listFiles();
for (File f :
files) {
if (f.isDirectory()){
fileDir(f);
}
System.out.println(f.getName());
}
}
}
程序入口代码如下:
public static void main(String[] args) {
//创建文件对象
File file = new File("D:\\临时文件夹\\测试");
fileDir(file);
}
运行结果如下:
ReadMe.txt
新建 Microsoft PowerPoint 演示文稿.pptx
新建 Microsoft Word 文档.docx
新建 好压 7Z 压缩文件.7z
不倦.txt
新建文件夹
删除文件和目录
delete()方法常用于删除文件目录和文件。
如果我们直接删除一个非空的文件夹,则会返回false,delete()方法删除文件夹时,只有该文件夹为空时才能删除成功。
我们可以使用递归进行整个文件的删除。
代码示例如下:
public static void delete(File dir){
//判断File对象是否存在
if (dir.exists()){
File[] files = dir.listFiles();
for (File f: files) {
if (f.isDirectory()){
delete(f);
}else {
f.delete();
}
}
dir.delete();
}
}
自定义的静态方法delete中,
- 首先判断传入的的File对象是否为空。
- 如果不为空,通过listFiles()方法获得该File对象目录中的全部子目录和文件对象。
- 使用foreach循环将子目录和文件依次拿出,用File类型变量f存储。
- 如果f是目录,则递归调用该方法本身。
- 如果f是文件,则通过delete()方法直接删除。
- 当子目录的文件全部删除后,dir.delete()将父目录也删除,然后跳出该方法。直至全部的递归跳出。该目录及该目录下的文件都将删除。
浙公网安备 33010602011771号