Java采用了流的机制来实现输入/输出。所谓流,就是数据的有序排列。

而流可以是从某个源(称为流源或Source of Stream)出来,到某个目的地(称为流汇或Sink of Stream)去的。

由流的方向,可以分成输入流和输出流。一个程序从输入流读取数据向输出流写数据。

流处理器所处理的流必定都有流源,而如果将流类所处理的流源分类的话,基本可以分成两大类:

第一 数组,String,File等,这一种叫原始流源。

第二 同样类型的流用做链接流类的流源,叫链接流源。

Java语言的I/O库是对各种常见的流源,流汇以及处理过程的抽象化。

客户端的Java程序不必知道最终的流源,流汇是磁盘上的文件还是数组等;(原始流)

也不必关心数据是否经过缓冲的,可否按照行号读取等处理的细节。(链接流)

要理解Java I/O这个庞大而复杂的库,关键是要掌握两个对称性跟两个设计模式。

Java I/O库具有两个对称性,它们分别是:

1 输入-输出对称性:

比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行的等级结构的根部。

而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。

2 byte-char对称:

InputStream和Reader的子类分别负责Byte和Char流的输入;

OutputStream和Writer的子类分别负责Byte和Char流的输出,

它们分别形成平行的等级结构。

Java I/O库的两个设计模式:

装饰者模式(Decorator)

适配器模式(Adapter)

1 装饰者模式:

在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。

【装饰者模式是Java I/O库的整体设计模式】

2 适配器模式:

在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。

【适配器模式应用到了原始流处理器的设计上面,构成了I/O库所有流处理器的起点。】

装饰者模式的具体应用:

Java I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的。

InputStream类型中的装饰模式:

InputStream有七个直接的具体子类,和四个属于FilterInputStream的具体子类。

根据输入流的源的类型,可以将这些流类分成两种,

即原始流类(Original Stream)和链接流处理器(Wrapper Stream)。

原始流处理器:

接收一个Byte数组对象,String对象,FileDiscriptor对象或者不同类型的流源对象。

包括以下四种:

1)ByteArrayInputStream

2)FileInputStream

3)PipedInputStream

4)StringBufferInputStream

链接流处理器:

就是可以接收另一个流对象作为源,并对之进行功能扩展的类。

包括以下几种:

1)FilterInputStream,四个子类如下:

1.1)BufferedInputStream

1.2)DataInputStream

1.3)LineNumberInputStream

1.4)PushbackInputStream

2)ObjectInputStream

3)SeqcueneInputStream

装饰模式的使用目的:

链接流对象接收一个原始流对象或者另外一个链接流对象作为流源;

另一方面他们对流源的内部工作方法做了相应的改变。

适配器模式的具体应用:

FileInputStream是一个适配器类:

它继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。

这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式。

StringBufferInputStream是一个适配器类:

它继承了InputStream类型,同时持有一个对String对象的引用。

这是一个将String对象适配成InputStream类型的对象形式的适配器模式。

ByteArrayOutputStream是一个适配器类:

它继承了OutputStream类型,同时持有一个对byte数组的引用。

这是一个将byte数组的接口适配成OutputStream类型的接口的适配器模式。

FileOutputStream是一个适配器类:

它继承了OutputStream类型,同时持有一个对FileDiscriptor对象的引用。

这是一个将FileDiscriptor接口适配成OutputStream接口的适配器模式。

StringReader是一个适配器类:

它类继承了Reader类型,持有一个对String对象的引用。

这是一个将String的接口适配成Reader类型的接口的适配器模式。

InputStreamReader是一个适配器类:

它继承了Reader类型,同时持有一个对InputStream对象的引用。

InputStreamReader是从byte输入流到char输入流的一个适配器

OutputStreamWriter是适配器类:

。。。

OutputStringWriter是从OutputStream到Writer的适配器类

与任何一个OutputStream的具体子类相链接时,OutputStringWriter可以将OutputStream类型的byte流适配成为char流。

其他参考内容:

原始流处理器

1. ByteArrayInputStream:为多线程的通信提供缓冲区操作功能,接收一个Byte数组作为流的源。

2. FileInputStream:建立一个与文件有关的输入流。接收一个File对象作为流的源。

3. PipedInputStream:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据,接收一个PipedOutputStream作为源。

4. StringBufferInputStream:将一个字符串缓冲区转换为一个输入流。接收一个String对象作为流的源。

(JDK帮助文档上说明:已过时。此类未能正确地将字符转换为字节。从JDK1.1开始,从字符串创建流的首选方法是通过StringReader类进行创建。只有字符串中每个字符的低八位可以由此类使用。)

链接流处理器:

1. FilterInputStream称为过滤输入流,它将另一个输入流作为流源。这个类的子类包括以下几种:

BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从缓冲区提供数据。

DataInputStream:提供基于多字节的读取方法,可以读取原始类型的数据。

LineNumberInputStream:提供带有行计数功能的过滤输入流。

PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。

2. ObjectInputStream可以将使用ObjectInputStream串行化的原始数据类型和对象重新并行化。

3. SeqcueneInputStream可以将两个已有的输入流连接起来,形成一个输入流,从而将多个输入流排列构成一个输入流序列。

Java语言的I/O库提供InputStream,OutputStream,Reader,Writer四个系列的类。

InputStream和OutputStream处理8位字节流数据;Reader和Writer处理16位的字符流数据。

InputStream和Reader处理输入,OutputStream和Writer处理输出。

Java语言支持四种类型:Java接口,Java类,Java数组,原始类型(即int,float等)。

前三种是引用类型,类和数组的实例是对象,原始类型的值不是对象。

也即,Java语言的数组是像所有的其他对象一样的对象,而不管数组中所存储的元素类型是什么。

java万法_Java I/O库的设计分析相关推荐

  1. java万法_Java内省机制和 BeanUtils实现

    内省(Introspector) Java 语言对 Bean 类属性.事件的一种缺省处理方法. 例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的 ...

  2. 以太坊java接口_java以太坊库web3j文档

    通过java打包以太坊智能合约 Web3j可以自动打包智能合同代码,以便在不脱离JVM的情况下进行以太坊智能合同部署和交互. 要打包代码,需要先编译智能合同: $ solc .sol --bin -- ...

  3. 车辆入库java程序_java扫描入库及出库,基于谷歌类开发.仅提供完整代码 连接SQL使用,...

    java扫描入库及出库,基于谷歌类开发.仅提供完整代码 连接SQL使用,需要自行制作中心服务器,中心服务器代码在本人另一实例里面,请自行下载 [实例简介] 扫描入库及出库,基于谷歌类开发.仅提供完整代 ...

  4. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  5. 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...

     [AI科技大本营导读]在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测 ...

  6. java se翻译_(翻译)Java SE 8 Lambda 标准库概览(下)

    Java SE 8 Lambda 标准库概览 8,Collectors 在目前的例子中,我们已经使用了collect()方法来收集流中的元素并放入List或Set中了.collec()方法的参数是一个 ...

  7. 基于Java的RDMA高性能通信库(六):SDP - Java Socket Direct Protocol

    目录 1.Java网络编程和套接字API的历史 2.InfiniBand 高速网络通信技术 3. Java 网络协议栈API 4.Java 7 SDP 远程直接内存存取(RDMA) 4.1 Java7 ...

  8. 基于Java的RDMA高性能通信库(一):IBM jVerbs库

    目录 1. verbs API 2. endpoint API 3. jVerbs 应用程序系统和运行时需求(仅限 Linux) 4. Java Socket Over RDMA 与 jVerbs 比 ...

  9. java调用c so动态库_jni 调用C动态库dll/so

    http://hi.baidu.com/fengying765/blog/item/7081113e5fde53e555e7233f.html 作为主调方的Java源程序TestJNI.java如下. ...

最新文章

  1. Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
  2. data-参数说明(模态弹出窗的使用)
  3. 【leetcode】Search in Rotated Sorted Array II(middle)☆
  4. hadoop生态搭建(3节点)
  5. matlab从flove,Matlab玩出新高度,变身表白女友神器_善良995的博客-CSDN博客
  6. 如何提高自己的思维逻辑能力?
  7. mysql 5.7参数目录_mysql5.7配置
  8. python缩进格式作用_关于自动缩进格式问题,高手帮忙!
  9. html2canvas在不同设备生成图片大小不一致问题
  10. 给技术型创业者的几点建议
  11. XCODE GDB这个是老版本xcode,新版的是lldb
  12. android 6.0 短信权限,Android6.0权限适配
  13. vim 配置文件留存
  14. 使用微信公众号openid获取用户信息判断是否关注公众号
  15. 她全奖赴海外读博,一作发Science,毅然回国后任东南大学教授!
  16. IM即时通讯-项目框架搭建(二)
  17. dell服务器 指示灯_Dell PowerEdge服务器或PowerVault存储诊断LED指示灯(QuadPack)故障排除...
  18. 搞前端开发的比后端多两倍,这意味着哪一个更有前途?
  19. C++沙海拾遗(三)
  20. 网络攻击知识之几种IP地址攻击方式

热门文章

  1. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第3篇]影响计算能力和存储能力的因素
  2. 【模板】在build中配置resources来防止我们资源导出失败的问题
  3. rpn风险等级评价准则_2019一建经济学习重点:技术方案经济效果评价
  4. 软件测试之控制流图以及环形复杂度独立路径求解问题
  5. 计算机实物知识需求市场调研,能力本位计算机维护论文
  6. java jna调用dll文件_关于java jna调用dll的问题
  7. ansible获取linux信息,ansible 获取系统信息的一些范例,ansible系统信息
  8. java类加载器_java底层内功 第一章,类加载器的任性
  9. mac安装win10_mac制作win10启动盘教程
  10. b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式