inputstreamreader outputstreamwriter是转换流
inputstreamreader 是字节流通向字符流的桥梁,它将字节流转换为字符流.
outputstreamwriter是字符流通向字节流的桥梁,它将字符流转换为字节流.
适配器模式
reader和writer 是target
被适配角色adaptee是 inputstream / outputstream
|
被适配者都是通过构造方法传递进来的,所以是对象适配器模式 |
经常说到编码和解码 也就是从字符到字节,或者字节到字符的转换,转换的规则就是按照指定的码表 有的时候可能会混淆,到底哪个方向才是编码?哪个才是解码? |
只要理解了码的含义 指的是二进制的 0 1 的数值序列 编码表中都有字符对应的数值序列编码 把字符从符号转变成二进制序列就是编码 解码就是转换为指定的字符形式 |
字节流和字符流之间的转换,自然离不开编码与解码 计算机最底层数据的存储是二进制序列,也就是字节 所以如果是从最底层读取,那么就是涉及二进制到字符的解码 从字符写入到最底层,就是字符的编码 |
适配器模式下,inputstreamreader继承了reader, 也看得出来reader是目标 这个场景下的适配器,就是可以通过对inputstream调用reader 相关的约定协议 也就是inputstream包装成了reader,看起来用起来像是一个reader,只不过底层内部是inputstream在工作 简言之,就是他就是一个reader,他的行为方式也是reader家族的,只不过里面有一个inputstream在干活 |
inputstreamreader的构造方法本质上只有一种那就是设置inputstream,这个被适配的对象 另外可选的设置编码,如果不设置使用系统默认的 设置系统编码的形式有: 使用给定字符集 和 使用给定字符集解码器 两种 |
构造方法中,都无一例外的设置了sd 他是streamdecoder, decode也就是解码(read 从字节流读取成为字符,解码) |
再回头仔细看下方法的代码,你会发现 inputstreamreader的所有方法只有两种类型,就仅仅做了两件事情 所有的构造方法设置了内部的streamdecoder sd的值 剩下的所有的方法都是无差别的转发到sd中 所以说,根本的解码是streamdecoder |
streamdecoder继承了reader,所以他是一个reader 另外他内部又包含了一个inputstream in; 这个in 通过他的forinputstreamreader系列方法,通过入参inputstream进行设置 |
streamdecoder中提供的其他方法(除了forinputstreamreader系列) 又都依赖于内部的私有方法 这些私有方法又借助于inputstream |
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 也是适配器模式 继承了writer 是writer 的 实现类 writer是适配器模式的目标target 被适配者adaptee是outputstream 被适配者通过构造方法传递,属于适配器模式中的对象适配器 |
类似inputstreamreader ,他的构造方法也是涉及 被适配者outputstream 以及字符编码 如果不设置使用系统默认的字符编码
设置系统编码的形式有:
使用给定字符集 和 使用给定字符集解码器 两种
|
内部有一个streamencoder se, encode 编码 如同我们前面介绍的那样 写入,是从字符,写入到二进制, 二进制序列才是真正的码, 那么也就是编码 所有的构造方法都共同做了初始化se这件事情 |
类似inputstreamreader outputstreamwriter所有的方法也只是做了两件事情 构造方法给se赋值 然后其他方法,无差别的转发请求到se |
streamencoder的实现形式 类似streamdecoder 他实现了writer,并且内部维护了一个outputstream 借助于foroutputstreamwrite系列方法对out进行设置 |
streamencoder 提供的方法 又都依赖于内部的私有的方法
这些私有方法又借助于outputstream
比如
|
如对本文有疑问, 点击进行留言回复!!
ScrollView和RecyclerView的滑动事件处理
配置JAVA环境+安装Android Studio全过程+踩坑记录
Android P Camera2当SD卡被拔出来自动切换到内部存储
android 多个edittext 判空监听 让Button动态是否可点击
Android开源项目滚轮选择器WheelPicker的基本用法总结
网友评论