Java学习笔记之IO(十二):SequenceInputStream序列流

package com.io.g_sequence;

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.Enumeration;
import java.util.List;
import java.util.Vector;

import org.junit.Test;

/*

需求:把 a.txt 与 b.txt 文件的内容合并;

SequenceInputStream:表示其他流的逻辑串联。他从输入流的有序集合开始,并从第一个输入流开始读取,直到到达
文件末尾,接着从第二个输入流读取,以此类推,直到到达包含的最后一个输入流的文件末尾为止;

 */

public class Demo1 {

	// 使用字节流实现文件的合并
	@Test
	public void test1() throws IOException{
		// 找到目标文件
		File inFile1 = new File("D:\\a.txt");
		File inFile2 = new File("D:\\b.txt");
		File outFile = new File("D:\\c.txt");
		
		// 建立输入输出通道
		FileInputStream fileInputStream1 = new FileInputStream(inFile1);
		FileInputStream fileInputStream2 = new FileInputStream(inFile2);
		FileOutputStream fileOutputStream = new FileOutputStream(outFile);
		
		// 建立缓冲数据
		byte[] buf = new byte[1024];
		int len = 0;
		
		// 将两个输入流加入集合中
		List<FileInputStream> list = new ArrayList<FileInputStream>();
		list.add(fileInputStream1);
		list.add(fileInputStream2);
		
		// 循环取出输入流,读取数据,然后再将数据输出到文件中
		for (int i = 0; i < list.size(); i++){
			FileInputStream in = list.get(i);
			while ((len = in.read(buf)) != -1){
				fileOutputStream.write(buf, 0, len);
			}
			in.close();
		}
		
		fileOutputStream.close();
	}

	// 使用 SequenceInputStream 实现文件的合并
	@Test
	public void test2() throws IOException{
		// 找到目标文件
		File inFile1 = new File("D:\\a.txt");
		File inFile2 = new File("D:\\b.txt");
		File outFile = new File("D:\\c.txt");
		
		// 建立输入输出通道
		FileInputStream in1 = new FileInputStream(inFile1);
		FileInputStream in2 = new FileInputStream(inFile2);
		FileOutputStream out = new FileOutputStream(outFile);
		
		// 建立序列流对象,并将输入流加入到序列中
		SequenceInputStream inputStream = new SequenceInputStream(in1, in2);
		
		// 创建缓冲数组
		byte[] buf = new byte[1024];
		int len = 0;
		
		// 边读边写;直接调用序列流的read()方法就可以了,因为序列流可以自动从第一个输入流开始读取,直到读取完毕,
		// 然后再从第二个输入流开始读取,依次类推;
		while ((len = inputStream.read(buf)) != -1){
			out.write(buf, 0, len);
		}
		
		// 关闭资源
		inputStream.close(); // 实际关闭的是输入流
		out.close();
	}
	
	// 使用SequenceInputStream合并三个文件
	@Test
	public void test3() throws IOException{
		// 找到目标文件
		File inFile1 = new File("D:\\a.txt");
		File inFile2 = new File("D:\\b.txt");
		File inFile3 = new File("D:\\c.txt");
		File outFile = new File("D:\\d.txt");
		
		// 创建数据输入输出通道
		FileInputStream in1 = new FileInputStream(inFile1);
		FileInputStream in2 = new FileInputStream(inFile2);
		FileInputStream in3 = new FileInputStream(inFile3);
		FileOutputStream out = new FileOutputStream(outFile);
		
		// 将输入流加入Vector集合中 
		Vector<FileInputStream> vector = new Vector<FileInputStream>();
		vector.add(in1);
		vector.add(in2);
		vector.add(in3);
		// 获取Vector集合的迭代器
		Enumeration<FileInputStream> elements = vector.elements();
		
		// 创建序列流对象,传入Vector集合的迭代器
		SequenceInputStream inputStream = new SequenceInputStream(elements);
		
		// 建立缓冲数组
		byte[] buf = new byte[1024];
		int len = 0;
		
		// 边读边写
		while ((len = inputStream.read(buf)) != -1){
			out.write(buf, 0, len);
		}
		
		// 关闭资源
		inputStream.close();
		out.close();
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_29331365/article/details/78204468