设计模式中巧记I/O
一、I/O
1. I/O操作中的设计模式
概要
- 以设计模式角度,自顶向下理解I/O源码结构
- 理解字节与字符的关系
1.1 装饰者模式(输入流为例)
- 背景:通过继承扩展对象耦合度高,使用装饰者扩展可以在不改变现有结构的情况下,动态地给对象增加额外功能,耦合度底且灵活,一个具体对象可以有多个装饰者
- 字节流

抽象构件:第二行,InputStream接口,定义字节流的基本操作抽象装饰者:第三行,与抽象构建接口是组合关系,动态的传入具体构件。第四行通过扩展抽象构件子类,为具体构件添加新的功能具体构件:第一行,实现抽象构件操作,具体装饰者为每一个具体的构件添加新的职责具体装饰者:第四行,有新职责的具体构建
- 装饰者模式为字节流带来的增强
- 使用
InputStream时,是以一个字节一个字节形式读或写,而BufferedInputStream与BufferedOutputStream为字节流提供了缓冲区,读数据时一次性读取一块数据放到缓冲区中,当缓存区读取完后,输入流会再次填充缓冲区,直到输入流被读取完,缓冲区可以减少IO操作。
- 使用
DataInputStream,从字节流中灵活的读取并重建Java的基本类型与String类型数据
1.2 适配器模式(输入流为例)
- 背景:需要开发的业务功能在组件库中已经存在,但与新的接口规范不兼容,重新开发成本太高,所以使用适配器模式能解决这些问题
- 已有字符流读写接口
Reader与Writer,新的需求是字节流访问数据源,然后由字符流处理
- 为什么使用自符流
- 根本原因:内存中数据操作是以字节为单位(给机器看的);一般持久化到磁盘不同的编码对应不同的字符(给人类看的),也可以以字节形式持久化到硬盘,供软件与硬件阅读。
- 字节流操作单元为字节(8byte)。InputStream中的read()方法,是以
一个字节为单位读取,读到末尾返回-1、它的重载方法read(byte[])内部是通过for循环调用read()实现一次读入一个字节数组,按字节的read()方法的会有频繁IO操作,普通IO模型也会阻塞线程,直到返回一个字节数据或-1,效率太低
- 字节流操作单元为字节(8byte)。InputStream中的read()方法,是以
- 字符流操作单元为Unicode码点(16byte),使用缓存读写。将数据持久化到磁盘 ,使用字节写入会乱码,因为不同语言(汉语、英语等)都有自己对应的编码表,例如英文一个字母可以用一个字节表示,但汉语需要用两个字节,甚至一些特殊符号需要更多字节(Unicode的辅助字符),一个字节一个字节写入很大可能会乱码。所以字符符流会先根据对应的码表将内容写入缓冲区,缓冲区满了持久化到磁盘。使用字符流有两个好处
- 利用缓存读写,避免内存与操作系统频繁IO操作,提高效率
- 写入时指定编码表可以有效避免乱码问题
适配器模式中字符流与字节流

字符流
Reader

Writer

-PS:个人笔记,望读者勘误。本文只例举了字节输入流与字符输入流两种,若读者理解了可以结合源码看输出流中设计模式
设计模式中巧记I/O的更多相关文章
- 巧记 In/hasOwnProperty/for…in/for…of/forEach区别
写在前面 上面提到的这些东西,反复的记忆,反复的忘记.现分享一种巧记方法,有需要,请参考,希望你也过目不忘. 仅提供巧记思路.仅提供巧记思路.仅提供巧记思路. 1. in 用于判断属性是否在对象上(包 ...
- [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式
ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- 业务零影响!如何在Online环境中巧用MySQL传统复制技术【转】
业务零影响!如何在Online环境中巧用MySQL传统复制技术 这篇文章我并不会介绍如何部署一个MySQL复制环境或keepalived+双主环境,因为此类安装搭建的文章已经很多,大家也很熟悉.在这篇 ...
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- java软件设计模式——单例设计模式中的【饿汉式】与 【懒汉式】示例
以下为单例设计模式中的两种经典模式的代码示意: 单例设计模式(spring框架IOC,默认创建的对象都是单例的): 饿汉式: public class SingleClass { private Si ...
- WPF封装控件时 检测是否在设计模式中
原文:WPF封装控件时 检测是否在设计模式中 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/article/detail ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...
随机推荐
- ArrayList,HashSet,SortedSet之间的区别是什么?
今天看Redis官方案例,出现了列表和集合概念,列表在Java中指的就是List,集合在Java中指的就是Set,那么怎么实现列表和集合,以及它们有什么区别呢? 我写了个Demo演示下: import ...
- Redis 缓存更新一致性
当执行写操作后,需要保证从缓存读取到的数据与数据库中持久化的数据是一致的,因此需要对缓存进行更新. 因为涉及到数据库和缓存两步操作,难以保证更新的原子性. 在设计更新策略时,我们需要考虑多个方面的问题 ...
- mysql事务提交和回滚机制
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码: 2 连接数据库,验证密码: 3 验证成功,获得用户信息,比如存款余额等: 4 用 ...
- 使用SlimYOLOv3框架实现实时目标检测
介绍 人类可以在几毫秒内在我们的视线中挑选出物体.事实上,你现在就环顾四周,你将观察到周围环境并快速检测到存在的物体,并且把目光回到我们这篇文章来.大概需要多长时间? 这就是实时目标检测.如果我们能让 ...
- DeepMind爆出无监督表示学习模型BigBiGAN,GAN之父点赞!
[导读]今天,DeepMind爆出一篇重磅论文,引发学术圈热烈反响:基于最强图像生成器BigGAN,打造了BigBiGAN,在无监督表示学习和图像生成方面均实现了最先进的性能!Ian Goodfell ...
- win10系统 端口查看问题。
首先看图根据系统自带命令netsta介绍,说明显示协议系统信息和当前TCP/IP 网络连接. 使用范例: 打开命令提示符窗口,在这里输入命令netstat -an,然后按下回车键,这时可以显示出电脑中 ...
- [codevs1036]商务旅行<LCA:tarjan&倍增>
题目链接:http://codevs.cn/problem/1036/ 今天翻箱倒柜的把这题翻出来做了,以前做的时候没怎么理解,所以今天来重做一下 这题是一个LCA裸题,基本上就把另一道裸题小机房的树 ...
- RecyclerView 的 Item 的单击事件
RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击 ...
- 读者来信 | 设置HBase TTL必须先disable表吗?(已解决)
今日有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.如遇到本人能力有限难以解决的问题,该贴将会 ...
- [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是 ...