Appearance
17.1 什么是 IO?
IO 的概念
IO(Input/Output)是指计算机与外部世界之间的数据交换。在 Java 中,IO 操作主要涉及到数据的读取(Input)和写入(Output)。
IO 的分类
在 Java 中,IO 操作可以分为以下几类:
按流向分:
- 输入流(Input Stream):从外部设备读取数据到程序
- 输出流(Output Stream):从程序写入数据到外部设备
按数据单位分:
- 字节流(Byte Stream):以字节为单位进行操作,适用于所有类型的数据
- 字符流(Character Stream):以字符为单位进行操作,适用于文本数据
按功能分:
- 节点流(Node Stream):直接与数据源或目标交互的流
- 处理流(Processing Stream):对节点流进行包装,提供额外功能
Java IO 体系
Java 的 IO 体系主要由以下类组成:
字节流
- 输入字节流:
InputStream及其子类 - 输出字节流:
OutputStream及其子类
字符流
- 输入字符流:
Reader及其子类 - 输出字符流:
Writer及其子类
字节流 vs 字符流
| 特性 | 字节流 | 字符流 |
|---|---|---|
| 操作单位 | 字节(8位) | 字符(16位) |
| 适用场景 | 所有类型数据(二进制、文本) | 文本数据 |
| 基类 | InputStream/OutputStream | Reader/Writer |
| 处理编码 | 不处理编码,直接操作字节 | 处理编码,将字节转换为字符 |
常用的 IO 类
字节流
- FileInputStream/FileOutputStream:从文件读取/写入字节
- ByteArrayInputStream/ByteArrayOutputStream:从字节数组读取/写入字节
- BufferedInputStream/BufferedOutputStream:带缓冲区的字节流
字符流
- FileReader/FileWriter:从文件读取/写入字符
- CharArrayReader/CharArrayWriter:从字符数组读取/写入字符
- BufferedReader/BufferedWriter:带缓冲区的字符流
- InputStreamReader/OutputStreamWriter:字节流与字符流的转换
IO 操作的基本步骤
- 创建流对象:根据需要选择合适的流类
- 执行 IO 操作:读取或写入数据
- 关闭流:使用完毕后关闭流,释放资源
示例:使用字节流读取文件
java
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
FileInputStream fis = null;
try {
// 创建字节输入流
fis = new FileInputStream("example.txt");
// 读取数据
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}示例:使用字符流读取文件
java
import java.io.FileReader;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
FileReader fr = null;
try {
// 创建字符输入流
fr = new FileReader("example.txt");
// 读取数据
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}使用 try-with-resources 自动关闭流
Java 7 引入了 try-with-resources 语句,可以自动关闭实现了 AutoCloseable 接口的资源,包括各种 IO 流。
java
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
// 使用 try-with-resources 自动关闭流
try (FileReader fr = new FileReader("example.txt")) {
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 流自动关闭,不需要 finally 块
}
}总结
IO 是 Java 中处理数据输入输出的重要机制:
IO 的分类:
- 按流向:输入流、输出流
- 按数据单位:字节流、字符流
- 按功能:节点流、处理流
IO 体系:
- 字节流:InputStream/OutputStream 及其子类
- 字符流:Reader/Writer 及其子类
字节流 vs 字符流:
- 字节流适用于所有类型数据
- 字符流适用于文本数据,处理编码
IO 操作步骤:
- 创建流对象
- 执行 IO 操作
- 关闭流(或使用 try-with-resources 自动关闭)
通过合理使用 IO 流,可以实现各种数据的读取和写入操作,满足不同场景的需求。
