Java I/O— 梳理各种“流”

本文旨在梳理Java I/O中各类流的关系,包括数据源、数据流和目的地的概念,以及输入流、输出流、字节流、字符流、节点流和处理流的区分。通过装饰者模式解释了Java IO中节点流和处理流的相互关系,强调了这种模式在扩展对象行为和避免“类爆炸”问题上的作用。文章强调理解这些原理对于灵活使用Java IO API至关重要。

背景

  Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。 —— 百度百科
  Java.io中有很多类,我们如何清楚地知道什么时候该用什么类呢?

目标

  本文的目标是梳理java.io中各个类的关系,了解各个类的应用场景。

概念

  数据源数据流目的地。在看关于java io的相关代码时,每次都要问问自己此时这三者各指的是谁。而本文主要是说数据流的。

这里写图片描述

归类

  按不同分类方法,将各种“流”归入不同的类。如图所示。

这里写图片描述

  虽然从不同的角度可以将各种各样的“流”分开,但是它们并不是各自独立的,会有交叉,就像FileInputStream是输入流,同时也是字节流或是节点流。
  区分输入流和输出流,看类的名称中有In,还是Out;或是有R还是W。区分字节流和字符流,基本上看结尾是Stream还是Reader、Writer。那如何区分节点流和处理流,这里就要说说设计模式中的装饰者模式了。
  刚才说了三种分类有交叉,字节流中既有节点流,又有处理流。字符流也是一样。这里咱们就以字节流为例,来用装饰者模式说明节点流和处理流的关系。
  学习这部分内容时,我们把数据流比作一个管子,如果说节点流是直接连接在数据源或目的地上的管子,那么处理流就是套在管子上的管子,如下图所示。

 这里写图片描述

装饰者模式与Java IO

这里写图片描述

  装饰者模式就是动态地将责任附加到对象上,扩展对象的行为。我们可以根据需要在节点流上,用处理流进行一层层的装饰。这样很灵活,通过组合的方式避免了“类爆炸”。但是,各种各样的“流”类,也造成了我们使用API的困难。不过明白了装饰者模式,你就可以根据需要任意包装了,也就不乱了。

常用类用途

节点流 用途
FileInputStream从文件读数据
ByteArrayInputStream从内存中的字节数组读数据

处理流 用途 新增行为/备注
BufferedInputStream带缓冲区的处理流,避免每读一个字节都要访问一次硬盘,提高访问速率,减小对硬盘的伤害如:readline()
DataInputStream将字节直接转换成各种基本类型(int,double……)进行读取如:readdouble()
ObjectInputStream将字节直接转化成对象进行读取serializable,transient,externalizable
InputStreamReader将字节转换成字符进行读取,对于汉字如果按字节读取,读出来后不知道是什么字——

总结

  文章并没有列举出java io中所有的输入输出流,重要的是根据上述的归纳总结能够举一反三,融会贯通。具体细节,还要查API文档。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值