设计模式中巧记I/O

一、I/O

1. I/O操作中的设计模式

  1. 提要
  • 以设计模式角度,自顶向下明白I/O源码结构
  • 明白字节与字符的关系
1.1 装饰者模式(输入流为例)
  1. 靠山:通过继续扩展工具耦合度高,使用装饰者扩展可以在不改变现有结构的情况下,动态地给工具增添分外功效,耦合度底且天真,一个详细工具可以有多个装饰者
  2. 字节省
    设计模式中巧记I/O
  • 抽象构件 :第二行,InputStream接口,界说字节省的基本操作
  • 抽象装饰者 :第三行,与抽象构建接口是组合关系,动态的传入详细构件。第四行通过扩展抽象构件子类,为详细构件添加新的功效
  • 详细构件 :第一行,实现抽象构件 操作,详细装饰者 为每一个详细的构件添加新的职责
  • 详细装饰者 :第四行,有新职责的详细构建
  1. 装饰者模式为字节省带来的增强
    1. 使用InputStream 时,是以一个字节一个字节形式读或写,而BufferedInputStreamBufferedOutputStream 为字节省提供了缓冲区,读数据时一次性读取一块数据放到缓冲区中,当缓存区读取完后,输入流会再次填充缓冲区,直到输入流被读取完,缓冲区可以削减IO操作。
    1. DataInputStream ,从字节省中天真的读取并重修Java的基本类型与String类型数据
1.2 适配器模式(输入流为例)
  1. 靠山:需要开发的营业功效在组件库中已经存在,但与新的接口规范不兼容,重新开发成本太高,以是使用适配器模式能解决这些问题
  • 已有字符流读写接口ReaderWriter ,新的需求是字节省接见数据源,然后由字符流处置
  1. 为什么使用自符流
    1. 根本原因:内存中数据操作是以字节为单元(给机械看的);一样平常持久化到磁盘差别的编码对应差别的字符(给人类看的),也可以以字节形式持久化到硬盘,供软件与硬件阅读。
    1. 字节省操作单元为字节(8byte)。InputStream中的read()方式,是以一个字节为单元读取,读到末尾返回-1 、它的重载方式read(byte[])内部是通过for循环挪用read() 实现一次读入一个字节数组 ,按字节的read()方式的会有频仍IO操作,通俗IO模子也会壅闭线程,直到返回一个字节数据或-1,效率太低
    1. 字符流操作单元为Unicode码点(16byte),使用缓存读写。将数据持久化到磁盘 ,使用字节写入会乱码,由于差别语言(汉语、英语等)都有自己对应的编码表,例如英文一个字母可以用一个字节示意,但汉语需要用两个字节,甚至一些特殊符号需要更多字节(Unicode的辅助字符),一个字节一个字节写入很大可能会乱码。以是字符符流会先凭据对应的码表将内容写入缓冲区,缓冲区满了持久化到磁盘。使用字符流有两个利益
      1. 行使缓存读写,制止内存与操作系统频仍IO操作,提高效率
      1. 写入时指定编码表可以有用制止乱码问题
  1. 适配器模式中字符流与字节省
    设计模式中巧记I/O

  2. 字符流

    java nio消息半包、粘包解决方案

  • Reader
    设计模式中巧记I/O

  • Writer
    设计模式中巧记I/O

PS:小我私家条记,望读者勘误。本文只例举了字节输入流与字符输入流两种,若读者明白了可以连系源码看输出流中设计模式

原创文章,作者:2d28新闻网,如若转载,请注明出处:https://www.2d28.com/archives/5304.html