[十六]JavaIO之InputStreamReader 与 OutputStreamWriter
简介
|
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小结
| 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小结
总结
[十六]JavaIO之InputStreamReader 与 OutputStreamWriter的更多相关文章
- [二十六]JavaIO之再回首恍然(如梦? 大悟?)
流分类回顾 本文是JavaIO告一段落的总结帖 希望对JavaIO做一个基础性的总结(不涉及NIO) 从实现的角度进行简单的介绍 下面的这两个表格,之前出现过 数据源形式 InputStream Ou ...
- Java-IO之InputStreamReader和OutputStreamWriter
InputStreamReader和OutputStreamWriter是字节流通向字符流的桥梁.它使用指定的差染色体读写字节并将其解码为字符.InputStreamReader的作用是将字节输入流转 ...
- java基础知识回顾之javaIO类---InputStreamReader和OutputStreamWriter转化流
InputStreamReader:是字节流通向字符流的桥梁: OutputStreamWriter 是字符流通向字节流的桥梁: package com.lp.ecjtu; import java.i ...
- Java IO(十六)InputStreamReader 和 InputStreamWriter
Java IO(十六)InputStreamReader 和 InputStreamWriter 一.介绍 InputStreamReader 和 OutputStreamWriter 是字节流通向字 ...
- Java IO--字符流--InputStreamReader 和 OutputStreamWriter
今天继续学习字符流的子类!!!! 先来熟悉一下适配器设计模式:(手写的,,嘿嘿) 因为据说InputStreamReader 和OutputStreamWriter采用了适配器模式(现在我还没能理解, ...
- 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结
实验十六 线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...
- 马凯军201771010116《面向对象与程序设计Java》第十六周知识学习总结
一:理论知识部分 1.线程的概念: 程序是一段静态的代码,它是应用程序执行的蓝 本. ‐进程是程序的一次动态执行,它对应了从代码加 载.执行至执行完毕的一个完整过程. 多线程是进程执行过程中产生的多条 ...
- 刘志梅201771010115.《面向对象程序设计(java)》第十六周学习总结
实验十六 线程技术 实验时间 2017-12-8 1.实验目的与要求 (1)当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十六周学习总结
学号-姓名<面向对象程序设计(java)>第十六周学习总结 实验十四 应用程序归档与线程初步 实验时间 2019-12-12 第一部分:理论知识总结 1.程序与进程的概念 ‐程序是一段静 ...
随机推荐
- python 迭代器,生成器
在 python 中我们常用 for in 来遍历 list, set, dict, str 等. for in 的本质就干了两件事: 调用 __iter__() 获取迭代器; 调用 next() 直 ...
- mysql数据库内容相关操作
第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...
- ECharts使用:this.dom.getContext is not a function
echarts 画图报错 this.dom.getContext is not a function; 原因:因为在初始化echarts的时候,echarts.js规定只能使用dom原生方法获取标签, ...
- curl命令行请求
curl -H "Content-Type: application/json" -X POST --data 'json post数据' -i http://xxx
- Round A - Kick Start 2019
a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6 题意: ...
- Java spring boot 2.0连接mysql异常:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
解决办法:application.yml提示信息表明数据库驱动com.mysql.jdbc.Driver'已经被弃用了.应当使用新的驱动com.mysql.cj.jdbc.Driver' com.my ...
- hadoop伪分布式搭建
安装好jdk 减压hadoop压缩包 cd /home/hadoop/hadoop-2.7.3/etc/hadoop vi hadoop-env.sh 文件末尾处添加 jdk环境变量 export J ...
- 发现了学校教务处官网的两个BUG
许久没有写博客了,感觉自己技术还差的好多-_-好像没啥好写的,之前学完了某易的WEB安全基础视频教程,自认对WEB安全入了门,忍不住就想拿学校教务处官网来练练手 教务处登录界面如图所示(为保护隐私,部 ...
- python Ajax
Ajax一.准备知识JSON1.什么是json JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSO ...
- Web前端-Vue.js必备框架(四)
Web前端-Vue.js必备框架(四) 计算属性: <div id="aaa"> {{ message.split('').reverse().join('') }} ...




