目录
[1. 常用字符流类](#1. 常用字符流类)
[2. 文本文件读写示例](#2. 文本文件读写示例)
[3. 编码问题处理](#3. 编码问题处理)
[1. 序列化与反序列化](#1. 序列化与反序列化)
引言
IO(Input/Output)流是Java中处理输入输出的核心机制,无论是文件读写、网络通信还是内存操作,都离不开IO流。本文将全面介绍Java IO流体系,帮助你掌握这一重要技术。

一、IO流概述
IO流是Java中用于处理输入输出操作的抽象概念,可以想象成数据的"管道":
输入流:从数据源(如文件、网络等)读取数据到程序
输出流:将程序中的数据写入到目的地
Java IO流的主要分类:
按数据单位分:
字节流:以字节(8bit)为单位(适合所有类型数据)
字符流:以字符为单位(适合文本数据)
按流向分:
输入流:读取数据,
输出流:写入数据
按角色分:
节点流:直接操作数据源/目的地。
处理流:对现有流进行包装增强
二、字节流体系
字节流是Java IO的基础,所有InputStream
和OutputStream
的子类都是字节流。
- 常用字节流类
类名 | 描述 |
---|---|
InputStream |
所有字节输入流的父类(抽象类) |
OutputStream |
所有字节输出流的父类(抽象类) |
FileInputStream |
文件字节输入流 |
FileOutputStream |
文件字节输出流 |
ByteArrayInputStream |
字节数组输入流 |
ByteArrayOutputStream |
字节数组输出流 |
BufferedInputStream |
缓冲字节输入流 |
BufferedOutputStream |
缓冲字节输出流 |
- 文件读写示例
java
// 文件复制示例(字节流)
public static void copyFile(String src, String dest) throws IOException {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
}
- 缓冲流的使用
缓冲流可以显著提高IO效率:
java
// 使用缓冲流提高效率
public static void bufferedCopy(String src, String dest) throws IOException {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
}
}
三、字符流体系
字符流专门用于处理文本数据,底层实际还是字节流+编码转换。
1. 常用字符流类
类名 | 描述 |
---|---|
Reader |
所有字符输入流的父类 |
Writer |
所有字符输出流的父类 |
FileReader |
文件字符输入流 |
FileWriter |
文件字符输出流 |
CharArrayReader |
字符数组输入流 |
CharArrayWriter |
字符数组输出流 |
BufferedReader |
缓冲字符输入流 |
BufferedWriter |
缓冲字符输出流 |
InputStreamReader |
字节流转字符流 |
OutputStreamWriter |
字符流转字节流 |
2. 文本文件读写示例
java
// 文本文件读取(字符流)
public static String readTextFile(String filename) throws IOException {
StringBuilder content = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
}
return content.toString();
}
// 文本文件写入(字符流)
public static void writeTextFile(String filename, String content) throws IOException {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
writer.write(content);
}
}
3. 编码问题处理
java
// 指定编码读写文件
public static void readWithEncoding(String filename, String charset) throws IOException {
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream(filename), charset);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
四、转换流
转换流是字节流和字符流之间的桥梁:
InputStreamReader
:将字节输入流转换为字符输入流
OutputStreamWriter
:将字符输出流转换为字节输出流
java
// 转换流示例
public static void convertStreamDemo() throws IOException {
// 字节流 -> 字符流
InputStream is = new FileInputStream("test.txt");
Reader reader = new InputStreamReader(is, "UTF-8");
// 字符流 -> 字节流
OutputStream os = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(os, "GBK");
}
五、对象流与序列化
Java提供了对象序列化机制,可以将对象转换为字节流进行存储或传输。
1. 序列化与反序列化
java
// 需要序列化的类必须实现Serializable接口
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 构造方法、getter/setter省略
}
// 对象序列化
public static void serializeObject(Object obj, String filename) throws IOException {
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(filename))) {
oos.writeObject(obj);
}
}
// 对象反序列化
public static Object deserializeObject(String filename)
throws IOException, ClassNotFoundException {
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(filename))) {
return ois.readObject();
}
}
Java IO流体系庞大但层次清晰,掌握其核心原理和常用类后,各种IO需求都能应对自如。随着Java版本更新,也出现了更多简化IO操作的API,但底层原理仍是IO流体系。