前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java IO 之 SequenceInputStream 原理解析

Java IO 之 SequenceInputStream 原理解析

作者头像
java404
发布2018-05-18 15:09:34
2.4K0
发布2018-05-18 15:09:34
举报
文章被收录于专栏:java 成神之路

概述

今天给大家分享一个比较有意思的 IO 流。SequenceInputStream ,听名字顾名思义。

SequenceInputStream 流可以把多个 InputStream 合并为一个 InputStream . 按照指定的顺序,把几个输入流连续地合并起来,使用起来像一个流一样。并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。

合并流的作用是将多个源合并合一个源。

使用场景

比如现在有三个文件【1.txt】、【2.txt】、【3.txt】;现在要把这三个文件按照1、2、3的顺序合并成一个文件输出到 【all.txt】文件中。

如果不知道有这个流,大家可能都是自己一个一个文件的去读,自己合并到一个文件中。 有了这个流,我们操作起来,代码更加优雅。

示例

代码语言:javascript
复制
public class SequenceInputStreamDemo {
    public static void sequenceStream() {
        // 创建字节输入流对象s1,s2,s3
        try (InputStream s1 = new FileInputStream(new File("d:\\1.txt"));
                InputStream s2 = new FileInputStream(new File("d:\\2.txt"));
                InputStream s3 = new FileInputStream(new File("d:\\3.txt"));) {

            /**
             * SequenceInputStream(Enumeration<? extends InputStream> e)
             * 通过记住参数来初始化新创建的 SequenceInputStream, 该参数必须是生成运行时类型为 InputStream
             * 对象的 Enumeration 型参数。
             */
            // 创建一个Vector类对象v
            Vector<InputStream> v = new Vector<>();
            /**
             * void addElement(E obj) 将指定的组件添加到此向量的末尾,将其大小增加 1。
             */
            // 将3个字节流对象添加到Vector容器中
            v.addElement(s1);
            v.addElement(s2);
            v.addElement(s3);
            // 获取Vector对象中的元素
            Enumeration<InputStream> e = v.elements();
            // 将Enumeration对象中的流合并(创建一个序列流,用于合并多个字节流文件s1,s2,s3)
            try (SequenceInputStream se = new SequenceInputStream(e);
                    OutputStream os = new FileOutputStream("d:\\all.txt")) {
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = se.read(b)) != -1) {
                    os.write(b, 0, len);
                    os.write("\r\n".getBytes());
                }
                System.out.println("合并成功");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        sequenceStream();
    }
}

该示例是,把D盘目录下的三个文件【1.txt】、【2.txt】、【3.txt】使用SequenceInputStream 流,按照 指定的文件的顺序合并输出到 【all.txt】 文件中。

SequenceInputStream 源码解析

代码语言:javascript
复制
public class SequenceInputStream extends InputStream {
    Enumeration<? extends InputStream> e;
    InputStream in;
    ......
}

SequenceInputStream 继承 InputStream。 定义了一个 Enumeration 的一个变量。该变量存储的是所有需要合并的InputStream。 定义了一个 InputStream的一个变量。该变量是记录 Enumeration 中正在读去的 InputStream。

Enumeration Enumeration 接口是Iterator迭代器的“古老版本”,从JDK 1.0开始,Enumeration接口就已经存在了(Iterator从JDK 1.2才出现)。Enumeration接口只有两个方法。

构造方法

提供两个构造方法。

  • 1、提供 Enumeration 类型的参数。 把传过来的参数赋值给 e 变量。 并调用 nextStream() 方法。

现在的迭代器都在使用Iterator,而这里为啥还在使用Enumeration 呢? 因为 Iterator 是在JDK1.2以后才有的,而SequenceInputStream 这个流在JDK1.0就已经存在了,故使用 Enumeration 当参数。

  • 2、提供两个 InputStream 类型的参数。 构造中把这两个流添加到 Vector 数组中,然后调用 elements 方法放回一个 Enumeration 类型,并赋值给 e 变量。 并调用 nextStream() 方法。
nextStream 方法

1、判断该流是否不为null,不为null 则把当前 InputStream 关闭。 2、该方法是先判断 Enumeration 中是否有可用的元素,如果获取 Enumeration 迭代器中下一个的元素,并赋值给 in 变量。

read 方法

读取 InputStream 中的数据。如果当前 InputStream 读取完了,再调用 nextStream 方法,获取下一个流,然后继续读取。直到所有的流都已经读取完毕。

close 方法

close 方法会关闭剩下没有读取完的所有的 InputStream。 读取过的InputStream 会在 调用 nextStream 方法中关闭。所以在这只需要关闭没有读取完的流就可以了。

看完源码是不是感觉 SequenceInputStream 超级简单,自己也可以实现一个。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.04.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用场景
  • 示例
  • SequenceInputStream 源码解析
    • 构造方法
      • nextStream 方法
        • read 方法
          • close 方法
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档