博文仅为个人学习记录,仅供参考
Java-File类
public class File extends Object implements Serializable, Comparable<File>
1.概述
File类是文件和目录的路径名的抽象表示。它封装的并不是一个真正的文件,而仅仅只是一个路径名,这个路径名表示的文件或者目录可以是存在的,也可以是不存在的,将来需要通过具体的操作来把这个路径的内容转换为具体存在的。
2.构造方法
方法名 | 说明 |
---|---|
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
File(URI uri) | 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。 |
范例:
import java.io.File;
public class FileMain01 {
public static void main(String[] args) {
File file01=new File("D:\\Java\\test.txt");
System.out.println(file01);//File类重写了toString()方法,输出的是路径名
File file02=new File("D:\\Java\\","test.txt");//一般parent是目录,child是文件名
System.out.println(file02);
File file03=new File(new File("D:\\Java\\"),"test.txt");
System.out.println(file03);
}
}
编译运行:
D:\Java\test.txt
D:\Java\test.txt
D:\Java\test.txt
由上面的图中看到,D:\Java\test.txt这个文件是不存在的,但是File对象可以正确创建且输出,而且输出的是路径名,说明File类重写了toString()方法,而且File类只是把路径名封装成一个对象而已。
3.创建文件或者目录
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当该抽象路径表示的不存在,创建一个以这个路径命名的新文件 |
public boolean mkdir() | 创建一个以此抽象路径命名的空目录 |
public boolean mkdirs() | 创建由此抽象路径命名的目录,包括任何必需但不存在的父目录 |
范例:
import java.io.File;
import java.io.IOException;
/*
File类创建功能:
public boolean createNewFile():创建由此抽象路径名命名的文件
1.文件存在,返回false
2.文件不存在,返回true
* public boolean mkdir():创建由此抽象路径名命名的目录
1.目录存在,返回false
2.目录不存在,返回true
public boolean mkdirs():创建由此抽象路径名命名的多级目录
1.目录存在,返回false
2.目录不存在,返回true
* */
public class FileMain02 {
public static void main(String[] args) throws IOException {
public static void main(String[] args) throws IOException {
//1.创建文件
File file01=new File("D:\\Java\\newFile.txt");
System.out.println(file01.createNewFile());//这里可能抛出一个IOException,暂时不处理,直接抛出
System.out.println("------------");
//2.创建目录
File file02=new File("D:\\Java\\newDir");
System.out.println(file02.mkdir());
System.out.println("------------");
//3.创建多级目录
File file03=new File("D:\\Java\\parentDir\\childDir");
System.out.println(file03.mkdirs());
System.out.println("------------");
}
}
}
编译运行:
true
------------
true
------------
true
------------
可以看到,三个方法的返回结果都是true,说明都创建成功,到D:\Java\目录下检查一下:
如上面2张图所示,文件newFile.txt、目录newDir、多级目录parentDir\childDir均创建成功。
要说明的是,执行creatNewFile()方法时可能抛出IOException异常,因为会对路径名进行检查,如果路径或者文件名不合法,比如含有\ / . * ? < > |
这些字符,都会抛出异常。在实际应用中应该捕获并处理这个异常。然而创建文件目录也可能有这样的问题,比如路径或者名称不合法,但是mkdir()方法并不抛出异常,也不捕获,而是检查不合法直接返回false,为什么这样做我也不是很能理解。比如下面的例子:
import java.io.File;
public class Test {
public static void main(String[] args) {
File file02=new File("D:\\Java\\abcdef\\newDir");
System.out.println(file02.mkdir());
System.out.println("------------");
File file03=new File("D:\\Java\\newDir<>*/");
System.out.println(file03.mkdir());
System.out.println("------------");
}
}
编译运行:
false
------------
false
------------
file02的路径名不合法,因为不存在acbdef这个目录;file03的目录名不合法,因为含有非法字符。但是它们都直接返回false而不是抛出异常。
4.判断和获取
这里不给出方法的列表,直接看范例。首先在Module02\目录下新建了一个java.txt文件(使用的平台是IDEA):
import java.io.File;
import java.io.IOException;
public class FileMain03 {
public static void main(String[] args) throws IOException {
File f1 = new File("Module02\\java.txt");
// public boolean isDirectory():判断抽象路径名表示的是不是目录
// public boolean isFile():判断抽象路径名表示的是不是文件
// public boolean exists():判断抽象路径名表示的目录或者文件存不存在
System.out.println(f1.isDirectory());
System.out.println(f1.isFile());
System.out.println(f1.exists());
System.out.println("----------------");
// public String getAbsolutePath():返回此抽象路径名的绝对路径名
// public String getPath():将此抽象路径名转换为路径名字符串
// public String getName():返回由此抽象路径名表示的文件或者目录的名称
System.out.println(f1.getAbsolutePath());
System.out.println(f1.getPath());
System.out.println(f1.getName());
System.out.println("----------------");
// public String[] list():返回此抽象路径名表示的目录中的文件或目录的名称字符串数组
// public File[] listFiles():返回此抽象路径名表示的目录中的文件或目录的File对象数组
File f2 = new File("D:\\Java");
String[] strArr = f2.list();
for (String str : strArr) {
System.out.println(str);
}
System.out.println("----------------");
File[] files = f2.listFiles();
for (File file : files) {
if (file.isFile()) {
System.out.println(file);//File类重写了toString方法
}
}
}
}
编译运行,控制台输出:
false
true
true
----------------
D:\Java\Projects\TestProject\Module02\java.txt
Module02\java.txt
java.txt
----------------
create file.txt
IntelliJ IDEA Community Edition 2020.2.2
jdk-11.0.8
jdk-9_汉化版.CHM
newDir
newFile.txt
parentDir
Projects
TestClass.java
TestInterface.java
TestMain.java
《Java核心技术 卷1 基础知识 (原书第10版)》.pdf
文档
----------------
D:\Java\create file.txt
D:\Java\jdk-9_汉化版.CHM
D:\Java\newFile.txt
D:\Java\TestClass.java
D:\Java\TestInterface.java
D:\Java\TestMain.java
D:\Java\《Java核心技术 卷1 基础知识 (原书第10版)》.pdf
值得说明的是public String[] list()
和public File[] listFiles()
这两个方法都要求File类对象封装的是一个目录的抽象路径,如果是这个抽象路径表示目录不存在或者表示的是一个文件,那么这两个方法都会返回null,如果不对返回值进行判断运行时就可能抛出java.lang.NullPointerException。
import java.io.File;
import java.io.IOException;
public class FileMain03 {
public static void main(String[] args) throws IOException {
// public String[] list():返回此抽象路径名表示的目录中的文件或目录的名称字符串数组
// public File[] listFiles():返回此抽象路径名表示的目录中的文件或目录的File对象数组
File f2 = new File("D:\\Java\\abcdefg");//表示的目录不存在
String[] strArr = f2.list();
for (String str : strArr) {
System.out.println(str);
}
System.out.println("----------------");
File[] files = f2.listFiles();
for (File file : files) {
if (file.isFile()) {
System.out.println(file);//File类重写了toString方法
}
}
}
}
编译运行:
Exception in thread "main" java.lang.NullPointerException
5.删除
如下面2张图所示,在D:\Java\Temp这个目录下,新建了文件file01.txt和目录dir02、dir03,在目录dir03下,有一个文件fil303.txt,然后通过File类的public boolean delete()
方法对这些文件和目录进行删除操作。
import java.io.File;
import java.io.IOException;
public class FileMain04 {
public static void main(String[] args) throws IOException {
File f1=new File("D:\\Java\\Temp\\file01.txt");
// public boolean delete():删除此抽象路径名表示的文件或目录
System.out.println(f1.delete());
File f2=new File("D:\\Java\\Temp\\dir02");
System.out.println(f2.delete());
File f3=new File("D:\\Java\\Temp\\dir03");
System.out.println(f3.delete());
}
}
编译运行,控制台输出结果:
true
true
false
从结果中看出,f1和f2表示的文件(目录)成功进行了删除操作,但是f3执行的delete()返回的是false,说明没有删除成功,到文件夹中去查看一下:
确实,file01.txt和dir02都成功删除了,但是dir03没有被删除,原因是dir03不是一个空目录,它下面含有一个文件file03.txt,如果想删除一个目录,则必须先删除下面所有的目录和文件。
package com.day17;
import java.io.File;
import java.io.IOException;
public class FileMain04 {
public static void main(String[] args) throws IOException {
File f4=new File("D:\\Java\\Temp\\dir03\\file03.txt");
System.out.println(f4.delete());
File f3=new File("D:\\Java\\Temp\\dir03");
System.out.println(f3.delete());
}
}
编译运行,控制台输出:
true
true
上面的代码先对file03.txt进行删除操作,这样dir03就成为了一个空目录,再对dir03进行删除操作,返回true。在文件夹中查看:
可以看到,dir03被删除了。
6.展开目录
如何展开一个目录:如果目录下是文件,直接获取;如果目录下是目录,继续展开。按照这个思想,可以使用递归调用的方式来实现目录的展开。定义一个递归方法void openDir(File f)
,方法的逻辑是这样的:
- 利用
File[] listFiles()
方法获取f下的所有目录和文件的路径的File对象数组,假设命名为files。 - 遍历files数组,判断其中的元素
files[i]
:files[i]
表示文件,直接输出文件名files[i]
表示目录,输出目录绝对路径名,继续展开,即调用openDir(files[i])
;
public class FileMain05 {
public static void main(String[] args) {
File f=new File("D:\\Java\\Temp\\");
openDir(f);
}
public static void openDir(File f){
File[] files = f.listFiles();//获取f下的所有目录和文件的File对象数组
//如果f封装的抽象路径表示的目录不存在或者表示的是一个文件,listFiles()会返回null,先做一个判断,否则在迭代中会抛出java.lang.NullPointerException,即空引用异常
if(files!=null) {
//这里用的是增强型for循环,也可以用普通for循环
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getName());
} else {
System.out.println("目录:" + file.getAbsolutePath());
openDir(file);
}
}
}
}
}
编译运行,控制台输出:
目录:D:\Java\Temp
目录:D:\Java\Temp
JavaEE.txt
目录:D:\Java\Temp\JavaEE
JavaEE01.txt
目录:D:\Java\Temp
JavaME.txt
目录:D:\Java\Temp
JavaSE.txt
看一下目录结构:
博文仅为个人学习记录,仅供参考