File 对象
1113字约4分钟
2024-08-08
在计算机系统中,文件是非常重要的存储方式。Java
的标准库 java.io
提供了 File
对象来操作文件和目录
路径
构造 File
对象,传入绝对路径
File file = new File("D:\\marui\\a.txt");
构造 File
对象,传入绝对路径
相对路径前面加上当前目录就是绝对路径,可以用 .
表示当前目录,..
表示上级目录
// 假设当前目录是 D:\marui
File f1 = new File("javac"); // 绝对路径是 D:\marui\javac
File f3 = new File(".\\javac"); // 绝对路径是 D:\marui\javac
File f3 = new File("..\\javac"); // 绝对路径是 D:\javac
File对象有3种形式表示的路径
getPath()
,返回构造方法传入的路径getAbsolutePath()
,返回绝对路径getCanonicalPath
,它和绝对路径类似,但是返回的是规范路径,规范路径就是把.
和..
转换成标准的绝对路径后的路径
public static void main(String[] args) throws IOException {
File file = new File("..");
System.out.println(file.getPath()); // ..
System.out.println(file.getAbsolutePath()); // E:\project\practice\java-pratice\..
System.out.println(file.getCanonicalPath()); // E:\project\practice
System.out.println(File.separator); // 根据当前平台打印"\"或"/"
}
文件和目录
File
对象既可以表示文件,也可以表示目录。构造一个 File
对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个 File
对象,并不会导致任何磁盘操作。只有当我们调用 File
对象的某些方法的时候,才真正进行磁盘操作
例如
isFile()
,判断该File
对象是否是一个已存在的文件isDirectory()
,判断该File
对象是否是一个已存在的目录
public static void main(String[] args) {
File f1 = new File("D:\\marui\\a.txt");
File f2 = new File("D:\\marui");
File f3 = new File("D:\\marui\\null");
System.out.println(f1.isFile()); // true
System.out.println(f1.isDirectory()); // false
System.out.println(f2.isFile()); // false
System.out.println(f2.isDirectory()); // true
System.out.println(f3.isFile()); // false
System.out.println(f3.isDirectory()); // false
}
用 File
对象获取到一个文件时,还可以进一步判断文件的权限和大小
boolean canRead()
:是否可读boolean canWrite()
:是否可写boolean canExecute()
:是否可执行long length()
:文件字节大小
对目录而言,是否可执行表示能否列出它包含的文件和子目录
创建和删除文件
当 File
对象表示一个文件时,可以通过 createNewFile()
创建一个新文件,用 delete()
删除该文件
public static void main(String[] args) throws IOException {
File file = new File("/path/file");
if (file.createNewFile()) {
// 文件创建成功
// TODO
if (file.delete()) {
// 文件删除成功
// TODO
}
}
}
File
对象提供了 createTempFile()
来创建一个临时文件,以及 deleteOnExit()
在 JVM
退出时自动删除该文件
public static void main(String[] args) throws IOException {
File f = File.createTempFile("tmp-", ".txt"); // 提供临时文件的前缀和后缀
f.deleteOnExit(); // JVM退出时自动删除
System.out.println(f.isFile()); // true
System.out.println(f.getAbsolutePath()); // C:\Users\MaRui\AppData\Local\Temp\tmp-8128499882453916485.txt
}
遍历文件和目录
当 File
对象表示一个目录时,可以使用 list()
和 listFiles()
列出目录下的文件和子目录名。listFiles()
提供了一系列重载方法,可以过滤不想要的文件和目录
public static void main(String[] args) throws IOException {
File file = new File("c:\\Windows");
// 获取该目录下所有的子目录名
File[] files1 = file.listFiles();
printFiles(files1);
File[] files2 = file.listFiles(new FilenameFilter() {
// 仅列出 .exe 文件
@Override
public boolean accept(File dir, String name) {
// 返回 ture 表示接受该文件
return name.endsWith(".exe");
}
});
printFiles(files2);
}
static void printFiles(File[] files) {
System.out.println("====== start ======");
if (files != null) {
for (File file : files) {
System.out.println(file);
}
}
System.out.println("====== end ======");
}
和文件操作类似,File
对象如果表示一个目录,可以通过以下方法创建和删除目录
boolean mkdir()
:创建当前File
对象表示的目录boolean mkdirs()
:创建当前File
对象表示的目录,并在必要时将不存在的父目录也创建出来boolean delete()
:删除当前File
对象表示的目录,当前目录必须为空才能删除成功
Path
Java
标准库还提供了一个 Path
对象,它位于 java.nio.file
包。Path
对象和 File
对象类似,但操作更加简单
public static void main(String[] args) throws IOException {
Path p1 = Paths.get(".", "project", "study");
System.out.println(p1); // .\project\study
Path p2 = p1.toAbsolutePath();
System.out.println(p2); // E:\project\practice\java-pratice\.\project\study
Path p3 = p2.normalize();
System.out.println(p3); // E:\project\practice\java-pratice\project\study
File f = p3.toFile();
System.out.println(f); // E:\project\practice\java-pratice\project\study
for (Path path : Paths.get("..").toAbsolutePath()) {
System.out.println(" " + path);
}
// project
// practice
// java-pratice
// ..
}
如果需要对目录进行复杂的拼接、遍历等操作,使用 Path
对象更方便