在Java里,输入输出流(I/O流)是用来处理数据输入和输出的重要机制。I/O流主要分为以下几类:
按流向分类
- 输入流(InputStream/Reader):用于从数据源(像文件、网络连接等)读取数据。
- 输出流(OutputStream/Writer):用于将数据写入到目标(如文件、网络连接等)。
按处理数据的单位分类
- 字节流(InputStream/OutputStream):以字节(8位)为单位处理数据。适用于处理二进制数据,像图片、音频、视频等。
- 字符流(Reader/Writer):以字符(16位)为单位处理数据。适用于处理文本数据,能自动处理字符编码和解码。
按功能分类
- 节点流:直接与数据源或目标相连,负责实际的数据读写。
- 处理流:对节点流进行包装,增强其功能,比如提供缓冲、加密等功能。
各类流的区别
字节流和字符流
- 处理数据单位:字节流以字节为单位处理数据,而字符流以字符为单位处理数据。
- 适用场景:字节流适用于处理二进制数据,字符流适用于处理文本数据。
- 编码处理:字节流不会自动处理字符编码,而字符流会自动处理字符编码和解码。
输入流和输出流
- 流向:输入流用于从数据源读取数据,输出流用于将数据写入到目标。
- 方法:输入流通常有
read()
方法用于读取数据,输出流通常有write()
方法用于写入数据。
节点流和处理流
- 功能:节点流负责实际的数据读写,处理流用于增强节点流的功能。
- 使用方式:处理流需要包装节点流使用,不能单独使用。
示例代码
以下是字节流和字符流的简单示例:
import java.io.*;
public class IOStreamExample {
public static void main(String[] args) {
// 字节流示例
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
// 字符流示例
try (FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")) {
int charData;
while ((charData = fr.read()) != -1) {
fw.write(charData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,FileInputStream
和FileOutputStream
属于字节流,FileReader
和FileWriter
属于字符流。