Java IO 从入门到深入(第一篇):IO体系结构 + File类详解
在 Java 开发中,IO(Input / Output) 是一个非常核心的知识体系。
几乎所有应用都会涉及 IO,例如:
- 读取配置文件
- 写日志
- 文件上传下载
- 网络通信
- 数据持久化
但很多初学者学习 IO 时都会遇到一个问题:
Java IO 类太多,看起来非常混乱。
例如:
InputStream
OutputStream
Reader
Writer
BufferedReader
FileInputStream
ObjectOutputStream
File
RandomAccessFile
如果没有理解 IO整体体系结构,很容易学一段忘一段。
一、什么是 IO?
IO 是:
Input / Output
即:
输入 / 输出
在计算机中:
| 类型 | 含义 |
|---|---|
| Input | 从外部读取数据 |
| Output | 向外部写入数据 |
例如:
文件 → 程序 (输入)
程序 → 文件 (输出)
再比如:
键盘 → 程序
程序 → 屏幕
本质上 IO 就是:
程序与外部资源之间的数据传输
这些外部资源包括:
文件
网络
数据库
控制台
内存
二、Java IO 的核心思想
Java IO 的核心思想只有一句话:
数据以"流(Stream)"的方式进行传输
可以理解为:
数据像水流一样流动
示意:
文件 -----> 程序
InputStream
程序 -----> 文件
OutputStream
因此 Java 中有两个最基础的类:
InputStream
OutputStream
三、Java IO 的体系结构
Java IO 可以分为 四大类。
Java IO
│
├── File
│
├── 字节流
│ InputStream
│ OutputStream
│
├── 字符流
│ Reader
│ Writer
│
└── 缓冲流 / 处理流
简单理解:
| 类型 | 作用 |
|---|---|
| File | 文件和目录操作 |
| 字节流 | 处理二进制数据 |
| 字符流 | 处理文本数据 |
| 缓冲流 | 提高 IO 性能 |
四、为什么要区分字节流和字符流?
这是 Java IO 的核心设计。
字节流
处理 二进制数据
例如:
图片
视频
音频
压缩文件
单位:
byte
字符流
处理 文本数据
例如:
txt
json
xml
html
单位:
char
总结:
| 类型 | 处理数据 |
|---|---|
| 字节流 | 二进制 |
| 字符流 | 文本 |
五、Java IO 学习路线
学习 IO 推荐顺序:
File
↓
字节流
↓
字符流
↓
缓冲流
↓
对象流
↓
NIO
本篇先讲 File 类。
六、File 类是什么?
File 是 Java IO 中最基础的类之一。
作用:
表示文件或目录的路径
注意:
File 不表示文件内容
只表示文件路径
例如:
D:/test/a.txt
源码:
java
public class File implements Serializable, Comparable<File>
七、File 的创建
创建 File 对象:
java
File file = new File("test.txt");
或者:
java
File file = new File("D:/test/a.txt");
也可以:
java
File file = new File("D:/test","a.txt");
注意:
创建 File 对象
不会创建真实文件
八、创建文件
创建真实文件:
java
file.createNewFile();
示例:
java
import java.io.File;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("test.txt");
if(!file.exists()){
file.createNewFile();
}
}
}
九、创建目录
创建单级目录:
java
file.mkdir();
创建多级目录:
java
file.mkdirs();
示例:
java
File dir = new File("D:/test/a/b");
dir.mkdirs();
十、判断文件信息
File 提供了很多方法。
判断是否存在
java
file.exists();
判断是否是文件
java
file.isFile();
判断是否是目录
java
file.isDirectory();
获取文件大小
java
file.length();
单位:
字节
十一、获取文件信息
获取文件名:
java
file.getName();
获取路径:
java
file.getPath();
获取绝对路径:
java
file.getAbsolutePath();
示例:
java
File file = new File("test.txt");
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());
十二、删除文件
删除文件:
java
file.delete();
注意:
删除不会进入回收站
删除目录要求:
目录必须为空
十三、列出目录内容
获取目录文件列表:
java
File dir = new File("D:/test");
File[] files = dir.listFiles();
for(File f : files){
System.out.println(f.getName());
}
十四、File 的使用场景
File 通常用于:
1 文件管理
例如:
创建文件
删除文件
遍历目录
2 配置文件读取
例如:
读取 application.properties
3 日志系统
日志框架会使用 File 写日志。
4 文件上传下载
Web 系统:
上传文件
保存文件
十五、File 常见易错点
1 File 不会创建文件
很多人误以为:
java
File file = new File("a.txt");
文件已经创建。
实际上:
没有创建
必须:
createNewFile()
2 mkdir 与 mkdirs 区别
mkdir 只能创建单级目录
mkdirs 可以创建多级目录
例如:
a/b/c
必须使用:
mkdirs
3 delete 删除目录要求为空
例如:
test/
a.txt
执行:
delete()
会失败。
十六、IO 面试高频问题
1 File 能读取文件内容吗?
答案:
不能
File 只能:
表示路径
管理文件
读取内容需要:
InputStream
Reader
2 File 和 Path 的区别
Java 7 之后:
java.nio.file.Path
更推荐使用。
但很多旧项目仍使用 File。
3 为什么 File 既可以表示文件又可以表示目录?
因为 File 本质是:
路径抽象
而不是文件对象。
十七、总结
本篇主要介绍了 Java IO 的整体结构。
Java IO 可以分为:
File
字节流
字符流
缓冲流
重点掌握:
File 的作用
表示文件路径
管理文件
常用方法:
exists()
createNewFile()
mkdir()
mkdirs()
delete()
listFiles()