目录:系统学习 Java IO---- 目录,概览

SequenceInputStream 可以将两个或多个其他 InputStream 合并为一个。 首先,SequenceInputStream 将读取第一个 InputStream 中的所有字节,然后读取第二个 InputStream 中的所有字节。 这就是它被称为 SequenceInputStream 的原因,因为 InputStream 实例是按顺序读取的。

构造方法
  1. SequenceInputStream(InputStream s1, InputStream s2): 通过两个参数初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2)
  2. SequenceInputStream(Enumeration<? extends InputStream> e): 通过枚举对象来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

提一下,Enumeration 接口是 Iterator 迭代器的“古老版本”;

把 2 个流结合的一个例子:

public class SequenceInputStreamExample {
public static void main(String[] args) throws IOException {
InputStream input1 = new FileInputStream("D:\\test\\1.txt");
InputStream input2 = new FileInputStream("D:\\test\\2.txt"); SequenceInputStream sequenceInputStream = new SequenceInputStream(input1, input2);
int data = sequenceInputStream.read();
while (data != -1) {
System.out.print((char)data);
data = sequenceInputStream.read();
}
}
}

这里使用了第一个构造函数,直接接收 2 个流,并把他们合并成一个流返回,这样可以使用被组合的两个 InputStream 实例,就像它是一个流一样。但是在读取完成之前,还是不可以关闭被组合的 2 个流,否则再进行读取会抛出异常。

组合 2 个以上的 InputStream

可以通过 2 种方式将两个以上的 InputStream 实例与 SequenceInputStream 组合在一起。

  1. 第一种方法是将所有 InputStream 实例放入 Vector 中,并将 Vector.elements() 传递给 SequenceInputStream 构造函数。 下面是一个如何将 Vector 传递给 SequenceInputStream 构造函数的示例:
public class SequenceInputStreamExample {
public static void main(String[] args) throws IOException {
InputStream input1 = new FileInputStream("D:\\test\\1.txt");
InputStream input2 = new FileInputStream("D:\\test\\2.txt");
InputStream input3 = new FileInputStream("D:\\test\\3.txt"); Vector<InputStream> streams = new Vector<>();
streams.add(input1);
streams.add(input2);
streams.add(input3);
// 利用 Vector 对象的 elements() 方法返回 enumeration 对象
SequenceInputStream sequenceInputStream = new SequenceInputStream(streams.elements());
int data = sequenceInputStream.read();
while (data != -1) {
System.out.print((char)data);
data = sequenceInputStream.read();
}
}
}
  1. 第二种方法是将 InputStream 实例两两组合到 SequenceInputStream 实例中,然后再和其他 SequenceInputStream 组合。 以下是实例:
public class SequenceInputStreamExample {
public static void main(String[] args) throws IOException {
InputStream input1 = new FileInputStream("D:\\test\\1.txt");
InputStream input2 = new FileInputStream("D:\\test\\2.txt");
InputStream input3 = new FileInputStream("D:\\test\\3.txt"); SequenceInputStream sequenceInputStream1 = new SequenceInputStream(input1, input2);
SequenceInputStream sequenceInputStream = new SequenceInputStream(sequenceInputStream1, input3);
int data = sequenceInputStream.read();
while (data != -1) {
System.out.print((char)data);
data = sequenceInputStream.read();
}
sequenceInputStream.close();
}
}



其实直接传进构造器的 2 个 InputStream ,也会被构造器内部包装成一个 Vector 的。部分源码如下:

 public SequenceInputStream(InputStream s1, InputStream s2) {
Vector<InputStream> v = new Vector<>(2);
v.addElement(s1);
v.addElement(s2);
e = v.elements();
try {
nextStream();
关闭 SequenceInputStream

当 SequenceInputStream 关闭时,它还将关闭它从中读取的 InputStream 实例,可以调用 close() 方法,还可以使用 Java 7 中引入的 try-with-resources 构造关闭。

public void close() throws IOException {
do {
nextStream();
} while (in != null);
} final void nextStream() throws IOException {
if (in != null) {
in.close();
}
if (e.hasMoreElements()) {
in = (InputStream) e.nextElement();
if (in == null)
throw new NullPointerException();
}
else in = null;
}

系统学习 Java IO (五)----使用 SequenceInputStream 组合多个流的更多相关文章

  1. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  2. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  3. 系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

    目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取 ...

  4. 系统学习 Java IO (十六)----这么多类,应该用哪个?

    目录:系统学习 Java IO---- 目录,概览 Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原 ...

  5. 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

    目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 I ...

  6. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

    目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...

  7. 系统学习 Java IO (九)----缓冲流 BufferedInputStream/BufferedOutputStream

    目录:系统学习 Java IO---- 目录,概览 BufferedInputStream BufferedInputStream 类为输入流提供缓冲. 缓冲可以加快IO的速度. BufferedIn ...

  8. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  9. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

随机推荐

  1. CMMI 能力成熟度模型集成

    关于CMMI的过程域,请参考 CMMI能力成熟度模型集成的过程区域 1.CMMI/SPCA概述 CMM是“能力成熟度模型(Capability Maturity Model)”的英文简写,该模型由美国 ...

  2. VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...

  3. LeapMotion Demo2

    原文:LeapMotion Demo2    官方doc有四个手势,最近尝试实现对握拳的识别,并能在我的程序界面上体现出来.    调试过程较为繁琐,幸好最终效果还差强人意! 首先看看我的效果图:   ...

  4. 生成EF后修改最大长度限制等

      右键属性    

  5. EF 两种删除方式的比较

    UserInfo user = from u in context.UserInfo where u.Id=343 select u; context.UserInfo.Remove(user); 用 ...

  6. jquery动态创建小广告

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. Visual Studio更改编码格式为“UTF-8”

    原文:Visual Studio更改编码格式为"UTF-8" 用VS2015新建了个Python文件,在VS2015打开时中文显示正常, 用Visual Studio Code文本 ...

  8. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  9. Generating Names and Classifying Names with Character-Level RNN

    原文地址:  Generating Names with Character-Level RNN 搬运只为督促自己学习,没有其他目的. Preparing the Data Download the ...

  10. Qt在Windows上的调试器CDB安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...