java中package io_[N天一练]java io package

从学习java以来,一直感觉jdk中的IO包是一个乱七八糟的包,里面堆积着无数的input、output,眼花缭乱。而使用的时候也经常是“圆环套圆环”式的,曾经愤愤地想这坑爹的设计让我们自己去记忆?最近闲来无事突然想了解为什么在打开一个io时一定要在finnally里将其关闭时,才想到应该好好梳理这部分的内容。

细了解之后发现java io包中的类体系其实还是比较好理解,只要明白了两种设计模式即可:适配器模式和装饰器模式。

适配器的类图如下(左边的是类适配器模式、右边的是对象适配器模式):

0818b9ca8b590ca3270a3433284dd417.png

适配器顾名思义就是要将adaptee类适配成具备target接口行为的adapter。类适配器和对象适配器的不同在于adapter到底是继承还是聚合adaptee类。

而装饰器模式与适配器,尤其是对象适配器的不同在于,它没有target接口约束,纯粹是为了需要去扩展被装饰对象,使其满足某些功能,其类图如下:

0818b9ca8b590ca3270a3433284dd417.png

其实在具体应用中不会有这么复杂的关系,最常见的应该是decorator直接依赖decoratee,然后扩展其功能。而且用了继承体系反而减弱了装饰器的模式的优点,因为在java中聚合往往要优先于继承。

说完这两个设计模式后,我们来梳理一下java io包中的类吧。其实java io包中核心的类是inputstream和outputstream类,面向字节流的读取。为了更好地支持IO读取,后在字节流基础上加入了字符流的读写体系:reader\writer,因此这两个体系的接口包括其下的子类功能往往是一一对应的。而这两大体系之间可以通过InputStreadReader\OutputStreamWriter来进行转化。而这里的转化采用的正是适配器模式,将inputstream\outputstream接口适配成支持字符读取的行为。

而在这两大读写体系中,所有的类又可以分为两类(以inputstream\outputstream):一类是通过适配器模式来架构的,主要为了将inputstream\outputstream读写接口适配成符合各种不同的数据介质,比如文件、byteArray,字符串等;另一类是通过装饰器模式来架构的,主要为了解决读取到数据后要进行一些额外的处理,比如BufferedInputStream类就是加入了缓冲区功能,这一类的类都是继承自FilterInputStream\FilterOutputStream类。其实第二类你要称为对象适配器模式也无可厚非。

所以所谓眼花缭乱的“圆环套圆环”式的调用方式,其实就是在做这些适配和装饰,使其满足特定的功能。因此假设我们要从一个文件中读取数据,首先肯定是要将利用适配器模式下的类,来获取一个支持文件读取的inputstream,如FileInputStream,代码如下:

InputStream in = new FileInputStream(new File("filename"));

然后就要加一些功能,比如说按字符流来读取吧

Reader reader = new InputStreamReader(in);        或者再加上一个缓冲区的功能

BufferedReader bReader = new BufferedReader(reader);        然后我们就可以一行一行的读数据了

String msg= null;

while((msg=bReader.readLine())!=null){

System.out.println(msg);

}       以上就是最近看java io 包的一些小心得!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值