第一部分:File类概述
理解Java File类的作用和基本概念
学习目标
掌握File类的核心功能,理解文件路径表示方法
File类的作用
- 表示文件或目录的路径
- 创建、删除、重命名文件或目录
- 查询文件属性(大小、修改时间等)
- 检查文件或目录是否存在
- 列出目录内容
文件路径表示
- 绝对路径:完整的文件路径(如:C:\Users\test.txt)
- 相对路径:相对于当前工作目录的路径(如:data/test.txt)
- 路径分隔符:Windows使用"\",Linux/macOS使用"/"
- File.separator:跨平台的路径分隔符
文件系统结构
- 根目录
- ├── 文件夹1
- │ ├── 文件1.txt
- │ └── 文件2.txt
- └── 文件夹2
File类表示
- File file = new File("path")
- 路径可以是文件或目录
- 路径可以是绝对或相对
- 路径可以不存在
第二部分:File类基本操作
掌握File类的核心方法及其使用
学习目标
熟练使用File类进行文件系统操作
1
创建File对象
创建File对象的多种方式
import java.io.File;
public class FileCreationExample {
public static void main(String[] args) {
// 使用绝对路径
File absoluteFile = new File("C:\\Users\\test\\file.txt");
// 使用相对路径
File relativeFile = new File("data/test.txt");
// 使用父目录和子路径
File parentDir = new File("data");
File childFile = new File(parentDir, "test.txt");
// 使用URI
File uriFile = new File("file:///C:/Users/test/file.txt");
}
}
提示:使用File.separator可以创建跨平台的路径
2
文件与目录操作
File类的核心方法
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class FileOperationsExample {
public static void main(String[] args) {
File file = new File("test.txt");
// 检查文件是否存在
boolean exists = file.exists();
System.out.println("文件存在: " + exists);
// 创建新文件
try {
boolean created = file.createNewFile();
System.out.println("文件创建: " + created);
} catch (IOException e) {
e.printStackTrace();
}
// 获取文件属性
System.out.println("文件名: " + file.getName());
System.out.println("绝对路径: " + file.getAbsolutePath());
System.out.println("文件大小: " + file.length() + " bytes");
System.out.println("最后修改时间: " + new Date(file.lastModified()));
// 重命名文件
File newFile = new File("new_test.txt");
boolean renamed = file.renameTo(newFile);
System.out.println("重命名: " + renamed);
// 删除文件
boolean deleted = newFile.delete();
System.out.println("删除文件: " + deleted);
}
}
提示:操作文件时注意权限问题,可能需要管理员权限
常见错误1:未处理IOException
File file = new File("test.txt");
file.createNewFile(); // 未处理IOException
解决方案:使用try-catch处理文件操作可能抛出的IOException
第三部分:目录操作
使用File类进行目录操作
学习目标
掌握目录的创建、遍历和管理方法
1
目录创建与删除
创建和删除目录的方法
import java.io.File;
public class DirectoryOperationsExample {
public static void main(String[] args) {
// 创建单级目录
File dir = new File("my_directory");
boolean created = dir.mkdir();
System.out.println("目录创建: " + created);
// 创建多级目录
File multiDir = new File("parent/child/grandchild");
boolean multiCreated = multiDir.mkdirs();
System.out.println("多级目录创建: " + multiCreated);
// 检查目录属性
System.out.println("是目录: " + dir.isDirectory());
System.out.println("目录路径: " + dir.getAbsolutePath());
// 删除目录(必须为空)
boolean deleted = dir.delete();
System.out.println("目录删除: " + deleted);
// 删除非空目录需要递归删除
deleteDirectory(new File("parent"));
}
// 递归删除目录及其内容
public static void deleteDirectory(File dir) {
if (dir.isDirectory()) {
File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
deleteDirectory(child);
}
}
}
dir.delete();
}
}
提示:删除目录前必须确保目录为空,否则需要递归删除
2
目录遍历
列出目录内容的方法
import java.io.File;
import java.util.Arrays;
public class DirectoryListingExample {
public static void main(String[] args) {
File dir = new File("."); // 当前目录
// 列出所有文件和目录
File[] files = dir.listFiles();
System.out.println("目录内容:");
if (files != null) {
for (File file : files) {
System.out.println(file.getName() +
(file.isDirectory() ? " (目录)" : " (文件)"));
}
}
// 使用FilenameFilter过滤文件
File[] javaFiles = dir.listFiles((dir1, name) -> name.endsWith(".java"));
System.out.println("\nJava文件:");
if (javaFiles != null) {
Arrays.stream(javaFiles).forEach(f -> System.out.println(f.getName()));
}
// 使用FileFilter过滤文件
File[] directories = dir.listFiles(File::isDirectory);
System.out.println("\n子目录:");
if (directories != null) {
Arrays.stream(directories).forEach(d -> System.out.println(d.getName()));
}
}
}
提示:使用FilenameFilter或FileFilter可以过滤目录内容
常见错误2:未检查listFiles()返回值
File dir = new File("invalid_dir");
File[] files = dir.listFiles();
for (File file : files) { // files可能为null
// ...
}
解决方案:使用前检查listFiles()返回值是否为null
第四部分:路径操作与文件属性
掌握路径操作和文件属性获取方法
学习目标
熟练操作文件路径和获取文件属性
1
路径操作方法
File类提供的路径操作方法
import java.io.File;
public class PathOperationsExample {
public static void main(String[] args) {
File file = new File("src/main/java/com/example/Test.java");
// 获取路径信息
System.out.println("文件名: " + file.getName());
System.out.println("父目录: " + file.getParent());
System.out.println("绝对路径: " + file.getAbsolutePath());
// 尝试获取规范路径(解析符号链接)
try {
System.out.println("规范路径: " + file.getCanonicalPath());
} catch (Exception e) {
e.printStackTrace();
}
// 路径分隔符
System.out.println("路径分隔符: " + File.separator);
System.out.println("路径分隔符(char): " + File.separatorChar);
// 路径比较
File file2 = new File("src/../src/main/java/com/example/Test.java");
System.out.println("路径相等: " + file.equals(file2)); // false
System.out.println("规范路径相等: " + compareCanonicalPaths(file, file2)); // true
}
// 比较两个文件的规范路径是否相同
public static boolean compareCanonicalPaths(File f1, File f2) {
try {
return f1.getCanonicalPath().equals(f2.getCanonicalPath());
} catch (Exception e) {
return false;
}
}
}
提示:使用getCanonicalPath()获取规范路径,解析符号链接和相对路径
2
文件属性检查
检查文件的各种属性
import java.io.File;
public class FileAttributesExample {
public static void main(String[] args) {
File file = new File("test.txt");
// 基本属性检查
System.out.println("是否存在: " + file.exists());
System.out.println("是文件: " + file.isFile());
System.out.println("是目录: " + file.isDirectory());
System.out.println("是绝对路径: " + file.isAbsolute());
System.out.println("可读: " + file.canRead());
System.out.println("可写: " + file.canWrite());
System.out.println("可执行: " + file.canExecute());
System.out.println("隐藏: " + file.isHidden());
// 文件大小
System.out.println("文件大小: " + file.length() + " bytes");
// 最后修改时间
System.out.println("最后修改时间: " + new java.util.Date(file.lastModified()));
// 磁盘空间信息
System.out.println("总空间: " + file.getTotalSpace() / (1024 * 1024 * 1024) + " GB");
System.out.println("可用空间: " + file.getFreeSpace() / (1024 * 1024 * 1024) + " GB");
System.out.println("可用空间(系统): " + file.getUsableSpace() / (1024 * 1024 * 1024) + " GB");
}
}
提示:检查文件权限时注意操作系统权限限制
常见错误3:路径分隔符错误
// Windows系统使用反斜杠
File file1 = new File("C:\\Users\\test\\file.txt");
// Linux/macOS使用正斜杠
File file2 = new File("/home/user/file.txt");
// 跨平台问题:在Windows上使用正斜杠可能无效
File file3 = new File("C:/Users/test/file.txt"); // 可能无法正确解析
解决方案:使用File.separator或File.separatorChar创建跨平台路径
第五部分:常见错误与最佳实践
避免文件操作中的常见陷阱
学习目标
识别并解决文件操作中的常见问题
文件操作最佳实践
- 使用try-with-resources确保资源关闭
- 操作前检查文件是否存在
- 使用规范路径进行路径比较
- 处理所有可能的IOException
- 使用NIO.2 API进行高级文件操作
性能优化
- 批量操作时缓存文件属性
- 避免频繁调用exists()方法
- 使用Files类替代File类(Java 7+)
- 递归操作时注意深度限制
安全考虑
- 验证用户输入的文件路径
- 避免路径遍历攻击
- 设置适当的文件权限
- 敏感文件操作需要用户确认
常见错误4:未检查文件操作结果
File file = new File("test.txt");
file.delete(); // 未检查操作是否成功
解决方案:检查文件操作方法的返回值,确保操作成功
第六部分:总结与练习
巩固学习成果,通过练习掌握文件操作技巧
学习目标
总结File类要点,通过实践加深理解
关键知识点总结
- File类表示文件或目录的路径
- 可以创建、删除、重命名文件和目录
- 可以查询文件属性和目录内容
- 路径可以是绝对或相对路径
- 使用File.separator创建跨平台路径
- 操作文件时注意处理IOException
动手练习
- 创建一个程序,列出指定目录下的所有文件和子目录
- 编写一个方法,计算目录及其子目录的总大小
- 实现文件备份功能,复制文件到备份目录
- 创建一个临时文件处理程序,处理完成后自动删除
- 实现文件搜索功能,按名称或扩展名搜索文件