理解 File 类的核心作用与设计定位
掌握 File 对象的创建方式与常用构造器
熟练使用 File 类查询文件 / 目录属性(存在性、权限、大小等)
能够遍历目录内容并区分文件与子目录
了解路径分隔符等系统相关字段的用途
java.io.File 类是 Java 中用于表示文件或目录路径名的抽象类。它提供了一种与平台无关的方式来操作文件系统,但不涉及文件内容的读写——那是 I/O 流(如 FileReader、FileInputStream)的职责。
核心特点
抽象表示:File 对象仅封装路径信息,不保证对应实体存在
不可变性:一旦创建,其路径名不能更改
平台无关:自动处理不同操作系统的路径格式
元数据操作:支持查询和修改文件属性(权限、时间戳等)
简单说:
File告诉你“在哪里”,流(Stream)负责“读写什么”
File 类提供四种构造器,适应不同路径组合需求:
// 示例:多种创建方式
File file1 = new File("config/app.properties");
File file2 = new File("config", "app.properties");
File configDir = new File("config");
File file3 = new File(configDir, "app.properties");
// 三者等价(在相同工作目录下)File 类提供静态字段,帮助编写跨平台路径代码:
// 跨平台安全的路径拼接(不推荐,应使用 Paths.get())
String path = "home" + File.separator + "user" + File.separator + "data.txt";
// 更佳实践(Java 7+):
Path path = Paths.get("home", "user", "data.txt");File file = new File("../logs/app.log");
System.out.println("Name: " + file.getName()); // app.log
System.out.println("Path: " + file.getPath()); // ../logs/app.log
System.out.println("Absolute: " + file.getAbsolutePath()); // /current/working/dir/../logs/app.log
System.out.println("Canonical: " + file.getCanonicalPath()); // /actual/path/to/logs/app.logimport java.io.File;
import java.util.Date;
public class FileInfo {
public static void main(String[] args) {
if (args.length == 0) {
System.err.println("请提供文件路径作为参数");
return;
}
File file = new File(args[0]);
System.out.println("=== 文件信息 ===");
System.out.println("名称: " + file.getName());
System.out.println("路径: " + file.getPath());
System.out.println("绝对路径: " + file.getAbsolutePath());
System.out.println("父目录: " + file.getParent());
System.out.println("是否存在: " + file.exists());
if (file.exists()) {
System.out.println("是否为文件: " + file.isFile());
System.out.println("是否为目录: " + file.isDirectory());
System.out.println("是否可读: " + file.canRead());
System.out.println("是否可写: " + file.canWrite());
System.out.println("文件大小: " + file.length() + " 字节");
System.out.println("最后修改: " + new Date(file.lastModified()));
}
}
}运行示例:
java FileInfo notes.txtimport java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class DirectoryLister {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入目录路径: ");
String dirPath = scanner.nextLine();
File dir = new File(dirPath);
if (!dir.exists()) {
System.out.println("目录不存在");
return;
}
if (!dir.isDirectory()) {
System.out.println("路径不是目录");
return;
}
System.out.println("\n=== 目录内容 ===");
File[] entries = dir.listFiles();
if (entries != null) {
for (File entry : entries) {
String type = entry.isDirectory() ? "【目录】" : "📄 文件";
System.out.printf("%s %s (%d 字节)\n",
type, entry.getName(), entry.length());
}
System.out.println("\n总计: " + entries.length + " 项");
} else {
System.out.println("无法读取目录内容(可能无权限)");
}
}
}使用
listFiles()比list()更强大,因为可直接调用isFile()/isDirectory()
try {
File tempFile = File.createTempFile("temp_", ".txt");
System.out.println("临时文件: " + tempFile.getAbsolutePath());
// 程序退出时自动删除
tempFile.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}// 只列出 .txt 文件
File dir = new File("documents");
File[] textFiles = dir.listFiles((dir1, name) -> name.endsWith(".txt"));
if (textFiles != null) {
for (File file : textFiles) {
System.out.println("文本文件: " + file.getName());
}
}File file = new File("a/b/../c/./data.txt");
System.out.println("原始路径: " + file.getPath()); // a/b/../c/./data.txt
System.out.println("规范路径: " + file.getCanonicalPath()); // /absolute/path/to/a/c/data.txtFile 不等于实际文件:创建 File 对象不会在磁盘生成文件
路径分隔符:避免硬编码 / 或 \,使用 File.separator 或 Paths.get()
renameTo() 已过时:Java 7+ 应使用 Files.move(source, target)
目录删除限制:delete() 无法删除非空目录,需递归删除内容
异常处理:getCanonicalPath() 可能抛出 IOException
现代替代方案:Java 7 引入的 java.nio.file 包(Path、Files)功能更强大,推荐新项目使用
File 类是文件 / 目录的路径抽象,不处理内容读写
提供四大构造器,灵活组合父路径与子路径
核心能力:属性查询、存在性检查、目录遍历、基础文件操作
关键方法:exists()、isFile()、listFiles()、createNewFile()、delete()
路径分隔符字段(separator)助力跨平台开发
对于复杂文件操作,建议迁移到 java.nio.file API
getAbsolutePath() 和 getCanonicalPath() 在什么情况下会返回不同结果?请举例说明。
为什么 File.delete() 无法删除非空目录?如何实现递归删除整个目录树?
在现代 Java 开发中,java.io.File 与 java.nio.file.Path 各有什么优势?何时应优先选择后者?