java io图_JAVA IO流结构图

49f040bee65e828d0a5b02ec8c547059.png

InputStreamReader和OutputStreamWriter分别继承自java.io包中的Reader和Writer,对他们中的抽象的未实现的方法给出实现。如:

public int read(char cbuf[], int offset, int length) throws IOException {

return sd.read(cbuf, offset, length);

}

如上代码中的sd(StreamDecoder类对象),在Sun的JDK实现中,实际的方法实现是对sun.nio.cs.StreamDecoder类和sun.nio.cs.StreamEncoder类的同名方法的调用封装。

我们可以通过这样两张 类结构关系图看下。

b6e2170f64acdfdb2e85d8bd3057f854.png

字节流到字符流解码的相关类结构关系

我们再来看下OutputStreamWriter相关的类结构关系:

23b1f2d25f45dcace3a87a01f13008a9.png

字符流到字节流编码相关类结构关系

我们看到这样几点:

InputStreamReader和OutputStreamWriter实际上是对同样继承了Reader和Writer的StreamDecoder和StreamEncoder的封装

StreamDecoder和StreamEncoder不是Java SE API中的内容,是Sun JDK给出的自身实现。但我们知道他们对构造方法中的字节流类(InputStream和OutputStream)参数和字符集类(Charset)进 行了封装,并通过此二者进行了字节流和字符流之间的编码解码转换

从表层来看,InputStreamReader和OutputStreamWriter做了InputStream/OutputStream字节流类到Reader/Writer之间的转换。

而从如上Sun JDK中的实现类关系结构中可以看出,是StreamDecoder和StreamEncoder的设计实现在实际上采用了适配器模式。

FileReader与InputStreamReader区别:

FileReader:需要从文件中读取数据时用,FileReader 是InputStreamReader 类的子类,

所有方法(read ()等)都从父类 InputStreamReader 中继承来,它使用的字符集可以由名称指定或显式给定,

或者可以接受平台默认的字符集,从API中可以看出,它是一个专门操作文件的一个Reader的子类。

InputStreamReader:需要从键盘接收数据时用。通常是按字符流读入时,一般也不仅从键盘,

也可以文件,网络,其它对象中读取,不过是按字符进行读取。它是Reader的直接子类。

主要区别:就在于构造函数!从 InputStreamReader 的构造函数中看到,参数为 InputStream 和编码方式,

可以看出,当要指定编码方式时,必须使用 InputStreamReader 类;

举个例子:将一个文本文件中的数据存储到另一个文件中,本身处理的就是纯文本文件那么就用FileReader;

如果是将键盘录入的数据保存到一个文件中,那么键盘传过来的是字节流,这时候就要使用InputStreamReader

最详细的IO结构图:

4864228154ece0a4ae450673f5fbbaff.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值