---------------------- 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