简介
InputStreamReader OutputStreamWriter是转换流
InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.
OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流.
适配器模式
Reader和Writer 是Target
被适配角色Adaptee是 InputStream / OutputStream
|
被适配者都是经过构造方法传递进来的,因此是对象适配器模式 |
编码与解码
常常说到编码和解码 也就是从字符到字节,或者字节到字符的转换,转换的规则就是按照指定的码表 有的时候可能会混淆,到底哪一个方向才是编码?哪一个才是解码? |
只要理解了码的含义 指的是二进制的 0 1 的数值序列 编码表中都有字符对应的数值序列编码 把字符从符号转变成二进制序列就是编码 解码就是转换为指定的字符形式 |
字节流和字符流之间的转换,天然离不开编码与解码 计算机最底层数据的存储是二进制序列,也就是字节 因此若是是从最底层读取,那么就是涉及二进制到字符的解码 从字符写入到最底层,就是字符的编码 |
InputStreamReader
适配器模式下,InputStreamReader继承了Reader, 也看得出来Reader是目标 这个场景下的适配器,就是能够经过对InputStream调用Reader 相关的约定协议 也就是InputStream包装成了Reader,看起来用起来像是一个Reader,只不过底层内部是InputStream在工做
简言之,就是他就是一个Reader,他的行为方式也是Reader家族的,只不过里面有一个InputStream在干活
|
InputStreamReader的构造方法本质上只有一种那就是设置InputStream,这个被适配的对象 另外可选的设置编码,若是不设置使用系统默认的 设置系统编码的形式有: 使用给定字符集 和 使用给定字符集解码器 两种 |
构造方法中,都无一例外的设置了sd 他是StreamDecoder, decode也就是解码(read 从字节流读取成为字符,解码)
 |
再回头仔细看下方法的代码,你会发现 InputStreamReader的全部方法只有两种类型,就仅仅作了两件事情 全部的构造方法设置了内部的StreamDecoder sd的值 剩下的全部的方法都是无差异的转发到sd中 因此说,根本的解码是StreamDecoder
|
StreamDecoder究竟是什么呢?
StreamDecoder继承了Reader,因此他是一个Reader 另外他内部又包含了一个InputStream in; 这个in 经过他的forInputStreamReader系列方法,经过入参InputStream进行设置 |
|
StreamDecoder中提供的其余方法(除了forInputStreamReader系列) 又都依赖于内部的私有方法 这些私有方法又借助于InputStream
|
因此能够看得出来InputStreamReader只是一个外包公司,他的活都是转包给StreamDecoder的
InputStreamReader小结
内部借助StreamDecoder的实现过程做为了解
须要记住InputStreamReader 是一个转换流,用于把InputStream转换为Reader
也就是让一个InputStream可以以Reader的方式进行工做, InputStreamReader 继承了Reader,因此他是一个Reader
他是Reader的实现类,提供了Reader协议常规的读取方法以及配套方法
掌握了构造方法便可,其余方法语义同Reader中的约定
public int read() throws IOException |
读取单个字符,返回读取到的字符串 |
public int read(char cbuf[], int offset, int length) |
读取字符到指定数组cbuf[] ,从指定偏移量offset开始存储,读取length个 |
public boolean ready() |
true表示下一个read()方法保证不会阻塞 |
public void close() throws IOException |
|
OutputStreamWriter
OutputStreamWriter 也是适配器模式 继承了Writer 是Writer 的 实现类 Writer是适配器模式的目标Target 被适配者Adaptee是OutputStream 被适配者经过构造方法传递,属于适配器模式中的对象适配器 |
 |
相似InputStreamReader ,他的构造方法也是涉及 被适配者OutputStream 以及字符编码
若是不设置使用系统默认的字符编码
设置系统编码的形式有:
使用给定字符集 和 使用给定字符集解码器 两种
|
内部有一个StreamEncoder se, encode 编码 如同咱们前面介绍的那样 写入,是从字符,写入到二进制, 二进制序列才是真正的码, 那么也就是编码 全部的构造方法都共同作了初始化se这件事情 |
 |
相似InputStreamReader OutputStreamWriter全部的方法也只是作了两件事情 构造方法给se赋值 而后其余方法,无差异的转发请求到se
 |
StreamEncoder的实现形式 相似StreamDecoder 他实现了Writer,而且内部维护了一个OutputStream 借助于forOutputStreamWrite系列方法对out进行设置
 |
StreamEncoder 提供的方法
又都依赖于内部的私有的方法
这些私有方法又借助于OutputStream
好比
|
OutputStreamWriter小结
OutStreamWriter是字符流通向字节流的桥梁
OutStreamWriter的适配器模式以及内部调用StreamEncoder的流程形式,跟InputStreamReader 样式差很少
只须要了解清楚他的构造方法便可
提供的其余的write方法,遵循Writer的约定协议
总结
InputStreamReader 和 OutputStreamWriter 是Reader 和 Writer的实现类
他们经过内部的StringDecoder 和 StringEncoder能够在字符流和字节流的处理过程当中插入编码和解码的行为
转换流做为适配器的应用,只须要理解目标和被适配角色便可
目标就是在外面抛头露面,直接接触使用的形式
被适配角色就是幕后默默奉献的
也就是他们提供了Reader和Writer字符形式的读写操做方式
而内部则都是使用被适配角色,字节流的形式进行读写
中间涉及到的编码与解码 则依靠StreamEncoder 和StreamDecoder
转换流只须要理解记住他们的构造方法便可
而后你就能够当作什么都没发生,他就是一个Reader或者一个Writer