第一部分: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

动手练习

  1. 创建一个程序,列出指定目录下的所有文件和子目录
  2. 编写一个方法,计算目录及其子目录的总大小
  3. 实现文件备份功能,复制文件到备份目录
  4. 创建一个临时文件处理程序,处理完成后自动删除
  5. 实现文件搜索功能,按名称或扩展名搜索文件