SequenceInputStream 介绍

SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并。

它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

合并两个文件

SequenceInputStream 类提供了两个构造函数。我们先来看第一个。
 所用的构造函数:
 SequenceInputStream(InputStream s1, InputStream s2)

通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),

以提供从此 SequenceInputStream 读取的字节。 即将文件 file1 和文件 file2 合并至文件 file3 中。

代码如下:

	public static void SequenceTest1(String file1, String file2,String file3){
try {
FileInputStream iStream1 = new FileInputStream(new File(file1));
FileInputStream iStream2 = new FileInputStream(new File(file2));
FileOutputStream iStream3 = new FileOutputStream(new File(file3));
InputStream si = new SequenceInputStream(iStream1, iStream2);
byte[] arr = new byte[1024*20];
int len = 0;
while ((len = si.read(arr))!=-1) {
iStream3.write(arr,0,len);
iStream3.flush();//刷新此缓冲的输出流。
}
si.close();
iStream3.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

合并三个文件

如果要用SequenceInputStream实现三个文件的合并,有两种方法:
一、通过合并两个文件是上述方法,嵌套使用,则可以实现三个文件的合并。在此不赘述。
二、使用SequenceInputStream类的第二个构造方法SequenceInputStream(Enumeration<? extends InputStream> e) 。

方法二是通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

即通过集合类的方式来传递文件的地址参数。

Java代码:

	public static void SequenceTest3(String file1, String file2,String file3,String file4){
SequenceInputStream iStream = null;
BufferedOutputStream bStream = null;
Vector<InputStream >vector = new Vector<InputStream>();
try {
vector.addElement(new FileInputStream(new File(file1)));
vector.addElement(new FileInputStream(new File(file2)));
vector.addElement(new FileInputStream(new File(file3))); Enumeration<InputStream>enumeration = vector.elements();
iStream = new SequenceInputStream(enumeration);
bStream = new BufferedOutputStream(new FileOutputStream(new File(file4)));
byte[] arr = new byte[1024*20];
int len = 0;
while ((len = iStream.read(arr))!=-1) {
bStream.write(arr, 0, len);
bStream.flush();//刷新此缓冲的输出流。
}
iStream.close();
bStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

上述代码是将 file1、 file2、 file3 的路径文件合并至 file4 的路径下。

合并多个文件(推荐使用)

以上虽然实现了多个文件的合并,但是,传递的参数太多,而且,不具有灵活性。
调用方法的时候,参数个数必须满足足够的要求。
下面,我们
通过字符串数组的方式来传递文件的地址参数,来对上面的方法进行
改进。


Java代码:
	public static void SequenceTest4(String[] filesrc,String fileresult){
SequenceInputStream iStream = null;
BufferedOutputStream bStream = null;
Vector<InputStream >vector = new Vector<InputStream>();
try {
for (int i = 0; i < filesrc.length; i++) {
vector.addElement(new FileInputStream(new File(filesrc[i])));
}
Enumeration<InputStream>enumeration = vector.elements();
iStream = new SequenceInputStream(enumeration);
bStream = new BufferedOutputStream(new FileOutputStream(new File(fileresult)));
byte[] arr = new byte[1024*20];
int len = 0;
while ((len = iStream.read(arr))!=-1) {
bStream.write(arr, 0, len);
bStream.flush();//刷新此缓冲的输出流。
}
iStream.close();
bStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

调用举例:

		String[] arr = {"1.txt", "2.txt","33.txt","333.txt"};
SequenceTest4(arr, "w.txt");

以上代码是将 1.txt、2.txt、33.txt、333.txt  中的文件合并至 文件 w.txt 中。

(调用时必须保证  1.txt、2.txt、33.txt、333.txt  存在。)

Java学习笔记——SequenceInputStream类合并文件的综合举例分析的更多相关文章

  1. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  2. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  3. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  4. Java学习笔记-File类的基本方法

    要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...

  5. 0018 Java学习笔记-面向对象-类的基本要素

    类与对象 大街上一个个的人,就是一个个对象 类是对一群对象的抽象,比如人都有性别.年龄.姓名,都会吃饭.睡觉等.姓名性别可以抽象为变量,吃饭睡觉可以抽象为方法,像下面一样定义个类来形容人 public ...

  6. Java学习笔记 04 类和对象

    一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...

  7. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

  8. Java学习笔记7---父类构造方法有无参数对子类的影响

    子类不继承父类的构造方法,但父类的构造方法对子类构造方法的创建有影响.具体来说就是: ①.当父类没有无参构造方法时,子类也不能有无参构造方法:且必须在子类构造方法中显式以super(参数)的形式调用父 ...

  9. Java学习笔记之——类与对象

    1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...

随机推荐

  1. 前端工程之模块化(来自百度FEX)

    模块化 是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易 ...

  2. Sequence

    http://poj.org/problem?id=2442 用STL写的时间为:5657MS #include<cstdio> #include<algorithm> #in ...

  3. List的数据结构

    从这张图片说起:TreeList的实现结构: 首先是构建函数 TreeList(Collection coll),调用增加函数: public void add(int index, Object o ...

  4. STM32 CAN 波特率设置及采样点设置

    一.CAN波特率 STM32 位时间定义: ● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内.其值固定为1个时间单元(1 x tCAN).● 时间段1(BS1):定义采样点的位置.它包 ...

  5. A - Fire Net - hdu 1045(二分图匹配)

    题意:一个阵地可以向四周扫射,求出来最多能修多少个阵地,墙不可以被扫射透,阵地不能同行或者或者列(有墙隔着例外) 分析:很久以前就做过这道题..当时是练习深搜来着,不过时间复杂度比较高,现在再看突然发 ...

  6. SKCropNode类

    继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode) NSCopying(SKNode) NSObject(NSObject) 框架 /System/ ...

  7. 二分-hdu-4768-Flyer

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4768 题目意思: 有n个A.B.C,每个Ai,Bi,Ci,对于每个P=Ai+k*Ci(P<=B ...

  8. mysql中如何更新一个字段的值为它本身的值连接上一个字符串

    CONCAT(str1,str2,...)     返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...

  9. Topcoder SRM 637 (Div.2)

    A.GreaterGameDiv2 不能更水 #line 7 "GreaterGameDiv2.cpp" #include<cstdio> #include <c ...

  10. Python 的数据类型

    列表 #coding=utf-8 students=["小明","小华","小李","小娟","小云" ...