前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[十六]JavaIO之InputStreamReader 与 OutputStreamWriter

[十六]JavaIO之InputStreamReader 与 OutputStreamWriter

作者头像
noteless
发布2018-09-14 14:49:46
6240
发布2018-09-14 14:49:46
举报
文章被收录于专栏:notelessnoteless

简介

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 编码与解码
  • InputStreamReader
  • StreamDecoder到底是什么呢?
    • InputStreamReader小结
    • OutputStreamWriter
      • OutputStreamWriter小结
      • 总结
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档