【java基础:IO】多个输入流通过SequenceInputStream序列流整合成一个大流然后输出的Demostration

时间:2023-01-26 04:52:01

摘要:SequenceInputStream叫序列流,可以整合多个输入流到一个大流。

输出的时候我提供了两种方式:方式一,字节流通过数组缓存;方式二,字节流通过缓冲区缓存。两种方式都必须掌握!



package sequence;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

public class SequenceDemo {
	/*
	 * 需求:将1.txt 2.txt 3.txt文件中的数据合并到一个文件中。 
	 * 方法:采用SequenceInputStream整合这几个输入流,合成一个大流,然后再输出到一个文件中。
	 */
	
	public static void main(String[] args) throws IOException {
		//首先是创建三个文件
		File file1=new File("1.txt");
		if(!file1.exists())
			file1.createNewFile();
		File file2=new File("2.txt");
		if(!file2.exists())
			file2.createNewFile();
		File file3=new File("3.txt");
		if(!file3.exists())
			file3.createNewFile();
		
		//将这个几个输入流存入ArrayList集合中
		ArrayList<FileInputStream> al=new ArrayList<>();
		for(int i=1;i<=3;i++) {
			al.add(new FileInputStream(i+".txt"));
		}
		
		/*因为SequnenceInputStream构造器中,但需要两个以上的流合成一个流时需采用SequenceInputStream(Enumeration<? extends InputStream> e) 
		 * 如果只是需要整合两个输入流,可采用SequenceInputStream(InputStream s1, InputStream s2)构造方法,更简单。
		 * 所以,我们现在就需要构建一个Enumeration,Collections集合工具类中有个泛型方法:enumeration(Collection<T> c) 可得到Enumeration.
		*/
		Enumeration<FileInputStream> en=Collections.enumeration(al);
		SequenceInputStream sis=new SequenceInputStream(en);
		
		/*
		 * 接下来就是对大输入流中的数据进行读入,并马上向输出流中进行存储。
		 * 为了提高效率,这儿采用了数组作为读入的缓冲区,当然还可以采用字节输入输出缓冲!
		 * 字节输入输出缓冲采用BufferedInputStream和BufferedOutputStream。
		 */
		FileOutputStream fos=new FileOutputStream("sequence.txt");
		byte[] buf=new byte[1024];
		int len=0;
		while((len=sis.read(buf))!=-1) {
			fos.write(buf,0,len);
		}
		sis.close();
		fos.close();
		
//***********下面演示采用字节输入输出缓冲来进行字节读写的操作***********************************
		//上面的方法是靠数组来缓存的,下面的方法是靠缓冲区来缓存的,两个方法选择其一即可
		//目的都是为了提高对文件的输入输出读写速度,两种方法都必须熟练掌握!
		//可参加我的另一篇文章:http://blog.csdn.net/topdandan/article/details/78461072
		SequenceInputStream sis1=new SequenceInputStream(en);
		FileOutputStream fos1=new FileOutputStream("sequence1.txt");
		BufferedInputStream bfi=new BufferedInputStream(sis1);
		BufferedOutputStream bfo=new BufferedOutputStream(fos1);
		int len1=0;
		while((len1=bfi.read())!=-1) {
			bfo.write(len1);
		}
		bfi.close();
		bfo.close();
	}

}
注意:若想了解更多有关字节流的IO操作,请点击我的另一篇文章:  采用字节流的IO演示