专栏首页noteless[十五]javaIO之SequenceInputStream

[十五]javaIO之SequenceInputStream

功能简介

SequenceInputStream  合并流

顾名思义,就是可以吧两个流合并起来

他并没有很复杂,单纯的很,仅仅实现了InputStream

他拥有两个构造方法把两个InputStream  或者一个InputStream类型的Enumeration中包含的所有的流连接起来

public SequenceInputStream(Enumeration<? extends InputStream> e)

public SequenceInputStream(InputStream s1, InputStream s2)

实现原理

所谓的连接,只是顺序的读取多个流而已

接下来,我们详细看下

内部包含一个in 以及一个Enumerationin用来表示当前的流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

需要了解到,它内部的实现细节,就是不断地循环遍历内部的流

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊Java进阶之并发基础技术—线程池剖析

    在JDK中,J.U.C并发包下的ThreadPoolExecutor核心类是一种基于Executor接口的线程池框架,将任务提交和任务执行解耦设计,其中Exec...

    用户2991389
  • Spring源码初探-IOC(1)-Bean的初始化

    对于一名Java码农来说,Spring真是太重要了。目前Spring的体系已经发展得非常壮大,其底层基石core,beans,context非常牢固。

    LNAmp
  • Hadoop1.2.1 WordCount Java 实现方式

    1.编写java程序用到的jar包,如下截图,其实貌似只需要一个hadoop-core-1.2.1.jar就可以了,这个jar包在Hadoop的减压目录下

    用户2992598
  • [翻译]如何分析Java线程dumps

    这是关于故障诊断文章的第二篇,翻译自《How to Analyze Java Thread Dumps》,原文地址:https://dzone.com/arti...

    LNAmp
  • 使用ASM实现简单的AOP

    之前一直使用greys及其内部升级二次开发版来排查问题。最近周末刚好事情不多,作为一名程序员本能地想要弄懂这么神奇的greys到底是怎么实现的?周末从githu...

    LNAmp
  • Spring Retry 学习记录

    在很多场景中,我们需要“重试”,重试意味着反复执行一段代码直至成功,或者重试多次无果后标记失败。“重试”的出发点有可能是为了保持状态的一致,也有可能是为了容忍被...

    LNAmp
  • [翻译]Java 6,7,8中的String.intern

    最近一直在关注“故障排查”的相关知识,首先着手的是OOM的异常。OOM异常通常会有Perm区的OOM(java7及以前)和HeapSpace的OOM,这两种各有...

    LNAmp
  • 三重Des对称加密在Android、Ios 和Java 平台的实现

    如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android、ios、java平台的使用方法;

    freesan44
  • Java高效分割字符串

    最近优化一段代码的调用时间,发现性能瓶颈居然是io和split!io操作慢情有可原,那么对于split有没有更高效的方法呢?

    weishu
  • ClassNotFoundException,NoClassDefFoundError,NoSuchMethodError排查

    在使用java开发的过程中时常会碰到以上三个错误,其中NoClassDefFoundError、NoSuchMethodError两个error遭遇得会多一些。...

    LNAmp

扫码关注云+社区

领取腾讯云代金券