1. 按流的方向划分
- 输入流(Input Stream):从外部设备(如文件、网络、键盘等)读取数据到程序中,典型抽象类为
InputStream(字节输入流)和Reader(字符输入流)。// 字节输入流(读取二进制文件) try (InputStream fis = new FileInputStream("test.jpg")) { int byteData; while ((byteData = fis.read()) != -1) { // 处理单个字节 } } // 字符输入流(读取文本文件) try (Reader reader = new FileReader("text.txt")) { int charData; while ((charData = reader.read()) != -1) { // 处理单个字符 } } - 输出流(Output Stream):从程序将数据写入到外部设备,典型抽象类为
OutputStream(字节输出流)和Writer(字符输出流)。// 字节输出流(写入二进制数据) try (OutputStream fos = new FileOutputStream("output.jpg")) { byte[] data = getImageData(); // 假设获取字节数据 fos.write(data); } // 字符输出流(写入文本) try (Writer writer = new FileWriter("output.txt")) { writer.write("Hello, Java IO!"); }
2. 按处理数据的单位划分
- 字节流:以字节(8 位)为单位处理数据,可处理所有类型的数据(如文本、图片、音频等)。核心抽象类:
InputStream(输入)、OutputStream(输出)。 - 字符流:以字符(16 位,Java 中默认 Unicode 编码)为单位处理数据,仅适合处理文本数据(如
.txt文件)。核心抽象类:Reader(输入)、Writer(输出)。
3. 按流的角色划分
- 节点流(节点流 / 低级流):直接与数据源(如文件、网络 Socket)相连,负责实际的读写操作。例如:
FileInputStream(文件字节输入流)、FileReader(文件字符输入流)、ByteArrayInputStream(字节数组输入流)等。 - 处理流(过滤流 / 高级流):不直接连接数据源,而是包装在其他流(节点流或处理流)之上,用于增强功能(如缓冲、转换、序列化等)。例如:
BufferedInputStream(缓冲字节流)、InputStreamReader(字节流转字符流的转换流)、ObjectInputStream(对象输入流)等。// 缓冲字节流(处理流+节点流) try (InputStream fis = new FileInputStream("largefile.bin"); BufferedInputStream bis = new BufferedInputStream(fis)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { // 处理缓冲数据 } } // 缓冲字符流(处理流+节点流) try (Reader reader = new FileReader("largefile.txt"); BufferedReader br = new BufferedReader(reader)) { String line; while ((line = br.readLine()) != null) { // 逐行处理文本 } }总结:Java IO 流的核心分类逻辑是按数据单位(字节 / 字符) 和按流的功能角色(节点 / 处理),在此基础上结合流向形成了完整的 IO 体系。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2503_91491877/article/details/154334284



