一、文件基础概念
1.1 文件的定义与分类
文件在计算机领域有广义和狭义之分:
- 狭义文件:指存储在硬盘等持久化介质上的数据集合
- 广义文件:操作系统进行资源管理的一种抽象机制,将各类软硬件资源统一抽象为"文件"进行管理
本章重点讨论狭义的文件概念,即存储在物理介质上的数据文件。
1.2 目录结构与文件组织
在日常使用中,我们通常所说的"文件夹"在专业术语中称为目录(directory) 。目录可以包含文件或其他子目录,也可以为空。除了存储内容外,目录还维护着文件的元数据信息。
树形组织结构
随着文件数量的增加,有效的文件管理变得至关重要。现代操作系统采用树形结构来组织文件系统,这种层次化结构类似于多叉树的组织形式:
- 根目录包含多个子目录
- 每个子目录可以继续包含更深层次的目录
- 最终在叶子节点存储实际的文件内容
1.3 文件路径系统
在复杂的目录结构中,通过文件路径来精确定位目标文件。
绝对路径
从文件系统的根目录开始,完整描述文件位置的路径。
示例:"C:\cctalk\java代码容易犯错的知识点\QQ截图20240915161600.png"
相对路径
相对于某个基准路径来描述文件位置:
.表示当前目录..表示父级目录
示例(基准路径:C:\cctalk):
.\java代码容易犯错的知识点\QQ截图20240915161600.png
1.4 文件类型详解
根据数据编码方式,文件可分为两大类:
二进制文件
- 图片、视频、音频文件
- 可执行程序(.exe)
- 动态链接库(.dll)
- 富文本文档(.docx)
文本文件
- 源代码文件(.java、.c)
- 纯文本文件(.txt)
- 配置文件等
编码原理:根据冯·诺依曼体系结构,所有文件在底层都是二进制格式。文本文件通过特定的编码规则(如UTF-8、UTF-16)将二进制数据转换为可读字符。
二、Java文件操作API
Java通过java.io.File类提供文件操作功能,支持文件系统操作和文件内容操作。
2.1 File类核心属性
为保证跨平台兼容性,File类提供路径分隔符常量:
| 属性 | 类型 | 说明 |
|---|---|---|
| pathSeparator | static String | 路径列表分隔符(;或:) |
| pathSeparatorChar | static char | 路径列表分隔符(字符形式) |
| separator | static String | 文件路径分隔符(\或/) |
| separatorChar | static char | 文件路径分隔符(字符形式) |
示例代码:
java
public class PathSeparatorDemo {
public static void main(String[] args) {
// 输出路径分隔符信息
System.out.println("Path Separator: " + File.pathSeparator);
System.out.println("Path Separator Char: " + File.pathSeparatorChar);
System.out.println("File Separator: " + File.separator);
System.out.println("File Separator Char: " + File.separatorChar);
}
}
2.2 构造方法详解
File类提供多种构造方式:
| 构造方法 | 说明 |
|---|---|
| File(String parent, String child) | 父目录路径 + 子文件路径 |
| File(String pathname) | 直接文件路径(绝对或相对) |
| File(File parent, String child) | 父目录File对象 + 子文件路径 |
2.3 核心方法实践
路径信息获取方法
java
// 绝对路径示例
File file = new File("C:" + File.separator + "cctalk/java代码容易犯错的知识点/test.txt");
System.out.println("父目录: " + file.getParent());
System.out.println("文件名: " + file.getName());
System.out.println("文件路径: " + file.getPath());
System.out.println("绝对路径: " + file.getAbsolutePath());
System.out.println("规范路径: " + file.getCanonicalPath());
// 相对路径示例
File relativeFile = new File("./java代码容易犯错的知识点/test.txt");
System.out.println("相对路径文件信息...");
文件状态检查方法
java
File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
// 检查文件存在性
System.out.println("文件是否存在: " + file.exists());
// 创建新文件
if (!file.exists()) {
System.out.println("创建文件结果: " + file.createNewFile());
}
// 类型判断
System.out.println("是否为目录: " + file.isDirectory());
System.out.println("是否为文件: " + file.isFile());
文件删除操作
java
// 立即删除
File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
System.out.println("删除结果: " + file.delete());
// 延迟删除(JVM退出时执行)
file.createNewFile();
file.deleteOnExit();
System.out.println("文件已标记为删除,将在JVM退出时执行");
// 保持程序运行以观察延迟删除效果
Thread.sleep(5000);
目录操作示例
java
File demoDir = new File("C:/cctalk/java代码容易犯错的知识点/Demo");
// 列出目录内容
System.out.println("=== 文件列表 ===");
String[] fileList = demoDir.list();
for (String fileName : fileList) {
System.out.println(fileName);
}
System.out.println("=== 文件对象列表 ===");
File[] files = demoDir.listFiles();
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
目录创建方法对比
java
// mkdir() - 需要父目录存在
File dir1 = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2");
System.out.println("mkdir创建结果: " + dir1.mkdir());
// mkdirs() - 自动创建中间目录
File dir2 = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4");
System.out.println("mkdirs创建结果: " + dir2.mkdirs());
文件重命名与移动
java
// 重命名文件
File oldFile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4/test.txt");
File newFile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4/hhhh");
System.out.println("重命名结果: " + oldFile.renameTo(newFile));
// 移动文件(重命名到不同目录)
File targetFile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/hhhh");
System.out.println("移动结果: " + newFile.renameTo(targetFile));
文件权限检查
java
File testFile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/hhhh");
System.out.println("可读权限: " + testFile.canRead());
System.out.println("可写权限: " + testFile.canWrite());
// 权限说明:canRead()和canWrite()检查的是Java进程对文件的访问权限
// 在Windows系统中,这对应于文件的属性设置中的读写权限
三、总结与实践建议
通过本章学习,我们掌握了:
- 文件系统基础:理解文件分类、目录结构和路径系统
- Java文件操作:熟练使用File类进行文件系统的各种操作
- 跨平台兼容:使用File类常量确保代码在不同操作系统上的兼容性
最佳实践建议:
- 始终使用File.separator代替硬编码的路径分隔符
- 在删除文件前检查文件存在性
- 使用mkdirs()创建目录链以避免目录不存在异常
- 及时处理IO异常,确保资源正确释放
下一章我们将深入探讨文件内容的读写操作,包括字节流、字符流以及高级IO操作技巧。