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:\javacFile对象有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 对象更方便