IO分类
一、从传输方式分类
从数据传输或运输方式的角度,IO 类分为:
- 字节流:
- 以字节(8 bit)为单位传输数据。
- 适合处理二进制文件(如图片、MP3、视频)。
- 字符流:
- 以字符为单位传输数据(字符大小依编码而定)。
- 适合处理文本文件。
核心区别:
- 字节:计算机视角的最小单位,给机器处理。
- 字符:人类可读的单位,给人理解。
二、字节流
- 定义:操作原始字节数据。
- 类结构:
- 输入:InputStream
- 子类:FileInputStream、ByteArrayInputStream 等。
- 输出:OutputStream
- 子类:FileOutputStream、ByteArrayOutputStream 等。
- 输入:InputStream
- 特点:
- 读取/写入单个字节。
- 用于二进制数据处理。
三、字符流
- 定义:操作字符数据(依赖编码)。
- 类结构(部分派生类略):
- 输入:Reader
- 子类:FileReader、CharArrayReader 等。
- 输出:Writer
- 子类:FileWriter、CharArrayWriter 等。
- 输入:Reader
- 特点:
- 读取/写入单个字符。
- 用于文本数据处理。 、
四、字节流与字符流的区别
- 操作单位:
- 字节流:单个字节。
- 字符流:单个字符(依编码,1 字符 = 1~3 字节)。
- UTF-8:中文 3 字节,英文 1 字节。
- GBK:中文 2 字节,英文 1 字节。
- 适用场景:
- 字节流:二进制文件(图片、视频等)。
- 字符流:文本文件(编码后的特殊二进制,人可读)。
- 本质:
- 字节流给计算机用,字符流给人用。
五、字节与字符的转换
- 编码与解码:
- 编码:字符 → 字节。
- 解码:字节 → 字符。
- 编码/解码不一致 → 乱码。
- 常见编码:
- GBK:中文 2 字节,英文 1 字节。
- UTF-8:中文 3 字节,英文 1 字节。
- UTF-16be:中文/英文均 2 字节(大端序)。
- UTF-16le:小端序。
- Java 特性:
- char 类型使用 UTF-16be 编码,占 2 字节。
- 一个 char 可存储 1 个中文或英文。
- 转换类:
- 输入:InputStreamReader(字节流 → 字符流)。
- 输出:OutputStreamWriter(字符流 → 字节流)。
六、从数据操作分类
从数据来源或操作对象角度,IO 类分为:
- 文件 (File):
- 字节流:FileInputStream、FileOutputStream。
- 字符流:FileReader、FileWriter。
- 用途:读写文件。
- 数组 (Array):
- 字节数组:ByteArrayInputStream、ByteArrayOutputStream。
- 字符数组:CharArrayReader、CharArrayWriter。
- 用途:操作内存中的数组数据。
- 管道 (Piped):
- 字节流:PipedInputStream、PipedOutputStream。
- 字符流:PipedReader、PipedWriter。
- 用途:线程间通信。
- 基本数据类型:
- DataInputStream、DataOutputStream。
- 用途:读写基本类型(如 int、double)。
- 缓冲操作 (Buffered):
- 字节流:BufferedInputStream、BufferedOutputStream。
- 字符流:BufferedReader、BufferedWriter。
- 用途:通过缓冲减少底层 IO 操作,提高效率。
- 打印 (Print):
- PrintStream、PrintWriter。
- 用途:格式化输出(如 System.out)。
- 对象序列化反序列化:
- ObjectInputStream、ObjectOutputStream。
- 用途:对象持久化或网络传输。
- 转换:
- InputStreamReader、OutputStreamWriter。
- 用途:字节流与字符流互转。