在日常开发中,我们几乎每天都在和“文件”打交道:读取配置文件、写日志、上传下载文件……
但很多时候,我们对“文件”的理解其实是比较模糊的,这篇文章我们将从文件的基本概念出发,重新了解一下文件~
1. 文件基础
1.1 文件与路径的基本概念
在实际开发中,我们经常需要和文件打交道,比如读取配置文件、写日志、上传下载文件等。因此,在学习 Java IO 之前,有必要先对“文件”本身有一个基本认识。
通常我们说的文件,是指保存在硬盘上的数据。需要注意的是,程序并不能直接操作硬盘这样的硬件资源,而是通过操作系统提供的“文件”这一抽象概念,间接完成对磁盘数据的读写。
1.2 路径的表示方式
为了在磁盘上定位某一个文件,操作系统引入了目录的概念
多个目录相互嵌套,最终形成一棵树形结构,从根目录出发,经过若干级目录,最终定位到目标文件。
这一整条“查找路径”,就是我们所说的文件路径。
路径中一般使用/作为目录分隔符:
- Linux / macOS 使用
/ - Windows 默认使用
\,但同样支持/
在实际开发中,通常统一使用/,可以减少跨平台时的兼容问题。
1.3 绝对路径与相对路径
路径又可以分为两类:
绝对路径
从根目录(或盘符)开始,一直描述到目标文件的位置,例如:
C:/Users/xxx/Desktop/test.txt绝对路径定位明确,但灵活性较差。
相对路径
相对于某一个基准目录来表示路径,例如:
./test.txt其中:
.表示当前目录..表示当前目录的上一层
需要注意的是,相对路径必须依赖基准目录。
在 Java 程序中,这个基准目录通常是 JVM 的工作目录,因此同一段代码在不同运行环境下,可能会出现“本地能跑,服务器找不到文件”的情况。
1.4 文件的类型
从开发角度来看,通常将文件分为两类:
- 文本文件:内容可以按字符语义进行解析,例如
.txt、.java、.xml - 二进制文件:内容按字节存储,需要特定程序解释,例如图片、音频、视频
二者的区别不在于“有没有意义”,而在于是否按照字符来理解文件内容。
1.5 重命名与移动的本质
renameTo方法既可以用于重命名文件,也可以用于移动文件。
在操作系统层面,这两种操作的本质是一样的:
修改文件在目录树中的位置映射。
- 如果在同一磁盘内移动,开销很小,速度很快
- 如果跨磁盘移动,则会退化为“复制 + 删除”,性能明显下降
这一点在处理大文件时尤为明显
2. File 类
Java 提供了java.io.File类,用于操作文件系统
需要强调的是:
File 类并不负责文件内容的读写
它的主要作用包括:
- 判断文件或目录是否存在
- 创建、删除文件
- 创建目录
- 重命名或移动文件
真正的文件读写,需要通过输入流、输出流来完成
有了文件,接下来我们来介绍一下IO~