1. Java IO流体系深度解析
作为Java开发者,IO操作是我们日常开发中最常接触的基础功能之一。Java IO流体系庞大而复杂,但理解其设计哲学和核心类的关系,能够帮助我们在实际开发中游刃有余地处理各种数据读写场景。
1.1 IO流分类与体系结构
Java中的IO流按照不同维度可以分为多种类型:
-
按流向分:
- 输入流(InputStream/Reader):数据从外部流向程序
- 输出流(OutputStream/Writer):数据从程序流向外部
-
按操作单元分:
- 字节流:以字节(8bit)为单位操作,适合所有类型文件
- 字符流:以字符为单位操作,专门处理文本文件
-
按角色分:
- 节点流:直接从数据源/目的地读写数据
- 处理流:对现有流进行包装,提供额外功能
Java IO体系中的40多个类都派生自4个抽象基类:
- InputStream/Reader(输入流基类)
- OutputStream/Writer(输出流基类)
编码注意事项:
- UTF-8编码下,一个中文字符占3个字节
- GBK编码下,一个中文字符占2个字节
- 存储和解析时编码不一致会导致乱码问题
- IDEA等现代IDE默认使用UTF-8编码
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字节流详解与实战
字节流是IO体系中最基础的流,能够处理所有类型的数据,包括文本、图片、音频、视频等。
2.1 字节输出流OutputStream
OutputStream是所有字节输出流的抽象基类,定义了以下核心方法:
java复制public void close(); // 关闭流并释放资源
public void write(byte[] b); // 写入字节数组
public void write(byte[] b, int off, int len); // 写入字节数组的一部分
public abstract void write(int b); // 写入单个字节
2.1.1 FileOutputStream实战
FileOutputStream是向文件写入字节数据的实现类,典型用法如下:
java复制// 创建文件输出流(文件不存在会自动创建,存在则清空)
FileOutputStream fos = new FileOutputStream("test.txt");
// 写入单个字节(实际只写入int的低8位)
fos.write(97); // ASCII 'a'
fos.write(98); // 'b'
fos.write(99); // 'c'
// 写入字节数组
byte[] data = {100, 101, 102};
fos.write(data);
// 写入字节数组的部分数据
fos.write(data, 1, 2); // 只写入101,102
fos.close(); // 必须关闭流
追加写入模式:
java复制// 第二个参数t
