功能简介

 
SequenceInputStream  合并流
顾名思义,就是可以吧两个流合并起来
 
他并没有很复杂,单纯的很,仅仅实现了InputStream
他拥有两个构造方法
把两个InputStream 
或者一个InputStream类型的Enumeration中包含的所有的流
连接起来
public SequenceInputStream(Enumeration<? extends InputStream> e)
public SequenceInputStream(InputStream s1, InputStream s2) 
 

实现原理

所谓的连接,只是顺序的读取多个流而已
接下来,我们详细看下
内部包含一个in 以及一个Enumeration
in用来表示当前的流
Enumeration保存了所有的流
如果构造方法入参为Enumeration
直接内部的Enumeration指向参数
如果传递的是两个InputStream
创建一个Vector,将这两个流添加到Vector中
然后调用Vector的elements 获得Enumeration
 
可以看得到,构造方法中都调用了nextStream这个方法
他是用来给in赋值的
如果是第一次调用,in肯定为null,所以不会进入第一行的if   会从Enumeration中读取一个流,赋值给in
如果是后来的调用,会把in指向的流进行close,然后在获取下一个流
显然,这个方法的场景就是构造方法执行之后的初始化
以及当一个流读取数组结束之后,尝试从下一个流读取
 
read()方法将会持续从in中读取数据
从一个流读取数据,如果不是-1 返回,如果是那么更新当前的in 指向下一个流
然后如果in不为null,进行读取 如果不是-1 返回,如果是那么更新当前的in 指向下一个流
.........
直到最后一个流, in就是一个游标
多参数的也是类似
从流中读取数据,如果读取到了,返回n,数据写入到字节数组b中了
如果n<=0 说明 当前的in读取结束了
那么调用nextStream 然后do  while循环读取
 
 
因为in始终指向当前的流,如果当前流为null,那么的确没有可用的
否则直接返回  in.available
 
close方法更直接
从头到尾通过nextStream遍历一遍所有的流
nextStream方法会把当前的流close掉
也就完成了所有的流的关闭
 

总结

SequenceInputStream的使用比较简单,只需要传递进入两个流或者一个包含流的Enumeration即可
他的read方法与InputStream方法的语义是相同的
再就没有任何难点了
换句话说,只要通过构造方法构造好了SequenceInputStream之后,就当做什么都没发生,他就是一个最基础的InputStream
 
需要了解到,它内部的实现细节,就是不断地循环遍历内部的流
 
 
 
 
 
 
 
 
 

[十五]javaIO之SequenceInputStream的更多相关文章

  1. [二十五]JavaIO之RandomAccessFile

    功能简介 我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此 但是 RandomAccessFile自成一派 此类的实例支持对随机访问文件的读取和写入 我们之前介绍过DataOutpu ...

  2. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  4. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  5. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  7. 十五个常用的jquery代码段【转】

    好的文章顶一个 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top 2 $('a.t ...

  8. 十五个常用的jquery代码段

    十五个常用的jquery代码段 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top ...

  9. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

随机推荐

  1. http 缓存学习.

    mark 一下 HTTP 缓存机制一二三 http://web.jobbole.com/92773/ 彻底弄懂HTTP缓存机制及原理 https://www.cnblogs.com/chenqf/p/ ...

  2. 引用Excel控件时,无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”请改用适用的接口

    类型Microsoft.Office.Interop.Excel.ApplicationClass未定义构造函数 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.Ap ...

  3. [HACK] docker runtime 挂载宿主机目录

    网上看到的很多所谓的挂载都是容器创建时期的挂载,而且参数都不清不楚,整理如下(--name别名自己加): docker run -v /src/path:/dest/path:rw ${IMAGE} ...

  4. java中class文件与jar文件

    1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...

  5. 771. Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S representing the ston ...

  6. Qt5和VS2017建立开发环境,安装后新建项目找不到Qt选项!!!

    最近开发win驱动和Qt5测试程序,需要建立Qt5和VS2017开发环境---对于Qt5和VS2017安装这里不做多余叙述. 参考资源很多,讲解也不错!! 这里切入正题:在VS2017中安转Qt vs ...

  7. python处理参数的getopt的使用

    在写脚本程序的时候需要添加一些额外的参数来实现脚本的附加功能或者增强功能,通常的做法是同sys.argv[i]直接来获取参数的值,但是这个比较局限,要求参数的输入一定要按照顺序. fileName = ...

  8. django(models)视图与html 简单的操作

    !数据提前写好 urls映射图 点击a标签之后

  9. COOKIE和Session的原理及异同

    COOKIE和Session的原理及异同 1. cookie的创建和读取 cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的w ...

  10. FCC(ES6写法) Make a Person

    用下面给定的方法构造一个对象. 方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(l ...