黑马程序员:合并流(序列流)的介绍:SequenceInputStream

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

SequenceInputStream:合并流(序列流)


将多个输入流对象拼接成一个流对象
构造函数:
两个流合并的用法:
SequenceInputStream(InputStream in1, InputStream in2)
{}

两个以上流的用法:
SequenceInputStream(Enumeration<? extends InputStream> e) 
{}

练习题一:
将1.txt,2.txt,3.txt 通过合并流的方法,将3个文件中的内存存入到4.txt中
提示:用Enumeration需要用到Vector的elements()方法
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;


/**
 * 将1.txt,2.txt,3.txt 通过合并流的方法,将3个文件中的内存存入到4.txt中
 * 提示:用Enumeration需要用到Vector的elements()方法,把流对象都加入到Vector集合中
 * 
 * @author rudy
 * 
 */
public class SequenceInputStreamTest {


	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Vector<FileInputStream> vec = new Vector<FileInputStream>();
		vec.add(new FileInputStream("c:\\1.txt"));
		vec.add(new FileInputStream("c:\\2.txt"));
		vec.add(new FileInputStream("c:\\3.txt"));
		Enumeration<FileInputStream> en = vec.elements();
		/*
		 * BufferedReader bfr = new BufferedReader(new InputStreamReader(new
		 * SequenceInputStream(en))); BufferedWriter bfw = new
		 * BufferedWriter(new FileWriter("c:\\4.txt")); String data = "";
		 * while((data=bfr.readLine())!=null){ bfw.write(data); bfw.newLine(); }
		 * bfr.close(); bfw.close();
		 */
		SequenceInputStream sin = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("c:\\4.txt");
		byte[] bytes = new byte[1024];
		int len = 0;
		while ((len = sin.read(bytes)) != -1) {
			fos.write(bytes, 0, len);
		}
		sin.close();
		fos.close();
	}


}

切割流对象
练习题二:
将一个图片文件切割成3分,并通过ArrayList(由于Vector效率较低,故使用ArrayList,他俩在大小扩张上有区别,ArrayList默认长度是10,如果装不下数据,则扩张50%,而Vector则扩展100%,且它是同步的,效率较慢)集合存储流对象,并通过SequenceInputStream合并流(因SequenceInputStream对于2个流对象以上仅支持Enumeration操作,所以要创建Enumeration匿名内部类,覆盖Enumeration中的hasMoreElements和nextElement方法,将方法内部使用iterator方法代替)


import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;


/**
 * 将一个图片文件切割成3分,并通过ArrayList(由于Vector效率较低,故使用ArrayList,他俩在大小扩张上有区别,
 * ArrayList默认长度是10 ,如果装不下数据,则扩张50%,而Vector则扩展100%,且它是同步的,效率较慢)集合存储流对象,
 * 并通过SequenceInputStream合并流 (因SequenceInputStream对于2个流对象以上仅支持Enumeration操作
 * ,所以要创建Enumeration匿名内部类,覆盖Enumeration中的hasMoreElements和nextElement方法
 * ,将方法内部使用iterator方法代替)
 * 
 * @author rudy
 * 
 * 
 */
public class SequenceInputStream1to3to1 {


	public static void main(String[] args) throws Exception {
		// 图片源地址
		String srcPath = "c:\\1.png";
		// 图片目标地址
		String desPath = "c:\\2.png";
		// 分割图片的地址集合(为了合并图片的时候获取分割图片的地址,通过该集合创造输入流集合)
		ArrayList<String> desPartList = new ArrayList<String>();


		splitImg(srcPath, desPartList);
		sequenceImg(desPath, desPartList);
	}


	// 分割图片方法
	private static void splitImg(String srcPath, ArrayList<String> desPartList)
			throws Exception {
		// 获取源图片地址的父目录
		String partPath = srcPath.substring(0, srcPath.lastIndexOf('\\'));
		// 获取扩展名
		String expandName = srcPath.substring(srcPath.lastIndexOf('.'));
		int partNum = 0;
		// 读取源图片
		BufferedInputStream bfis = new BufferedInputStream(new FileInputStream(
				srcPath));
		// 获取源图片大小
		int imgSize = bfis.available();
		// 根据图片大小,将图片分成3-4份
		byte[] bytes = new byte[imgSize / 3];
		int len = 0;
		while ((len = bfis.read(bytes)) != -1) {
			// 定义分割图片地址
			String desPartPath = partPath + "partimg_" + partNum + expandName
					+ ".part";
			// 将分割图片地址存入集合
			desPartList.add(desPartPath);
			FileOutputStream fos = new FileOutputStream(desPartPath);
			fos.write(bytes, 0, len);
			partNum++;
			fos.close();
		}
		bfis.close();
	}


	// 保存图片方法
	private static void sequenceImg(String desPath,
			ArrayList<String> desPartList) throws Exception {
		ArrayList<FileInputStream> partImgins = new ArrayList<FileInputStream>();
		// 获取分割图片地址并以输入流形式存入到新的集合
		for (Iterator<String> it = desPartList.iterator(); it.hasNext();) {
			partImgins.add(new FileInputStream(it.next()));
		}
		final Iterator<FileInputStream> it = partImgins.iterator();
		// 合并分割图片的输入流,覆盖Enumeration类下的方法,以便获取ArrayList的数据
		SequenceInputStream sis = new SequenceInputStream(
				new Enumeration<FileInputStream>() {


					@Override
					public boolean hasMoreElements() {
						return it.hasNext();
					}


					@Override
					public FileInputStream nextElement() {
						return it.next();
					}


				});
		FileOutputStream fos = new FileOutputStream(desPath);
		byte[] bytes = new byte[1024];
		int len = 0;
		// 将合并流中的数据输入到目标地址文件
		while ((len = sis.read(bytes)) != -1) {
			fos.write(bytes, 0, len);
		}
		fos.close();
		sis.close();
	}


}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值