Java中的IO流分为几类

Java IO 流详解:从分类到实践

在 Java 编程中,输入输出(IO)是程序与外部世界交互的核心能力 —— 无论是读取配置文件、处理网络数据,还是操作数据库,都离不开 IO 流的身影。但 IO 流体系庞大、类繁多,新手往往容易混淆。本文将从分类角度梳理 Java IO 流的核心体系,帮你建立清晰的知识框架。

一,流的划分:

按传输方式:

1. 字节流(InputStream,QutputStream):按照字节传输,机器可以自动识别内容,处理的是二进制文件,比如图片,np3等。

2.字符流(Reader,Writer): 按照字符传输,处理的是文本文件,可以可以看做特殊的二进制文件,通过编码格式可以直接阅读。

按数据划分:

1.常用的是文件流(FilelputStream,FileOutputStream等),

2.字节数组(ByteArraylnputStream,ByteArrayOutputStream),

3.字符数组流(CharArrayReader,CharArrayWriter),

4.转换流(InputStreamReader,OutputStreamWriter)等。

二、IO 流的本质:数据传输的 "管道"

在 Java 中,"流(Stream)" 是对数据传输的抽象 —— 就像水管运输水,IO 流负责在程序与外部设备(文件、网络、内存等)之间传输数据。流的特性是单向流动:数据要么从外部流入程序(输入流),要么从程序流向外部(输出流),这是理解 IO 流的基础。

三、IO 流的核心分类方式

Java IO 流可以从数据流向处理数据单位流的角色三个维度分类,三者相互交叉,共同构成了 IO 流的体系。

1. 按数据流向划分:输入流 vs 输出流

这是最直观的分类方式,以 "程序" 为参照物判断流向:

  • 输入流(Input):数据从外部设备流向程序,用于 "读取" 数据。核心基类:

    • 字节输入流:InputStream(抽象类,所有字节输入流的父类)
    • 字符输入流:Reader(抽象类,所有字符输入流的父类)
  • 输出流(Output)数据从程序流向外部设备,用于 "写入" 数据。核心基类:

    • 字节输出流:OutputStream(抽象类,所有字节输出流的父类)
    • 字符输出流:Writer(抽象类,所有字符输出流的父类)

2. 按处理数据单位划分:字节流 vs 字符流

这是区分 IO 流功能的关键,决定了流能处理的数据类型:

(1)字节流:处理所有数据类型
  • 单位:以字节(8 位二进制)为单位传输数据。
  • 适用场景:可处理任意类型数据(文本、图片、音频、视频等二进制数据)。
  • 核心基类
    • 输入:InputStream
    • 输出:OutputStream
  • 常见实现类
    • FileInputStream/FileOutputStream:读写文件的字节流
    • BufferedInputStream/BufferedOutputStream:带缓冲区的字节流(提升效率)
    • ByteArrayInputStream/ByteArrayOutputStream:操作字节数组的流
(2)字符流:专为文本设计
  • 单位:以字符(16 位 Unicode)为单位传输数据,本质是对字节流的 "包装",自动处理字符编码(如 UTF-8、GBK)。
  • 适用场景:仅用于处理文本数据(.txt、.java 等),避免字节流处理文本时的乱码问题。
  • 核心基类
    • 输入:Reader
    • 输出:Writer
  • 常见实现类
    • FileReader/FileWriter:读写文件的字符流(简化版,默认编码)
    • BufferedReader/BufferedWriter:带缓冲区的字符流(支持一行一行读写)
    • InputStreamReader/OutputStreamWriter:字节流与字符流的转换桥梁(可指定编码)

3. 按流的角色划分:节点流 vs 处理流

从功能上看,流可分为直接操作数据源头的 "节点流",和增强节点流功能的 "处理流":

(1)节点流(低级流)
  • 特点:直接连接数据源(如文件、内存、网络),是 IO 操作的 "基础管道"。
(2)处理流(高级流)
  • 特点:不直接连接数据源,而是 "包裹" 节点流或其他处理流,增强功能(如缓冲、转换、序列化等)。
  • 优势:简化操作(如缓冲流自动批量读写)、扩展功能(如对象流实现序列化)。

四、IO 流体系图:一目了然的类关系

为了更直观理解,整理核心类的继承关系如下:

字节流体系:
InputStream(基类)
├─ FileInputStream(文件节点流)
├─ BufferedInputStream(缓冲处理流)
├─ ObjectInputStream(对象处理流)
└─ ...

OutputStream(基类)
├─ FileOutputStream(文件节点流)
├─ BufferedOutputStream(缓冲处理流)
├─ ObjectOutputStream(对象处理流)
└─ ...

字符流体系:
Reader(基类)
├─ FileReader(文件节点流,简化版)
├─ BufferedReader(缓冲处理流)
├─ InputStreamReader(字节转字符处理流)
└─ ...

Writer(基类)
├─ FileWriter(文件节点流,简化版)
├─ BufferedWriter(缓冲处理流)
├─ OutputStreamWriter(字符转字节处理流)
└─ ...

五、实践建议:如何选择合适的 IO 流?

  1. 优先根据数据类型选字节流 / 字符流

    • 处理文本(如.txt、.csv):用字符流(避免乱码),推荐BufferedReader/BufferedWriter
    • 处理非文本(如图片、视频):必须用字节流,推荐BufferedInputStream/BufferedOutputStream
  2. 善用处理流提升效率

    • 缓冲流(BufferedXXX)能减少 IO 次数,几乎所有场景都建议搭配节点流使用。
    • 转换流(InputStreamReader)在需要指定编码(如 UTF-8)时必用(FileReader默认编码可能导致乱码)。
  3. 注意资源关闭

    • 流属于 "非内存资源",必须手动关闭(Java 7 + 可用try-with-resources自动关闭)。

六、总结

Java IO 流的分类本质是从不同角度描述流的特性:

  • 流向决定 "读 / 写",单位决定 "处理数据类型",角色决定 "功能层次"。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值