java类组合举例_【Java】SequenceInputStream类合并文件的综合举例分析 | 学步园

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;

Vectorvector = new Vector();

try {

vector.addElement(new FileInputStream(new File(file1)));

vector.addElement(new FileInputStream(new File(file2)));

vector.addElement(new FileInputStream(new File(file3)));

Enumerationenumeration = 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;

Vectorvector = new Vector();

try {

for (int i = 0; i < filesrc.length; i++) {

vector.addElement(new FileInputStream(new File(filesrc[i])));

}

Enumerationenumeration = 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  存在。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值