JavaSE笔记15.10-IO流-SequenceInputStream
一. 概述
序列流SequenceInputStream:
表示其他输入流的逻辑串联,可对多个字节输入流进行合并。
1. 构造方法
//按顺序读取2个字节输入流,先读取s1,再读取s2
SequenceInputStream(InputStream s1,InputStream s2);
//按顺序读取由枚举产生的字节输入流
SequenceInputStream(Enumeration<? extends InputStream> e);
2. Enumeration接口
- 是最早的迭代输出接口,最早使用Vector时就是使用Enumeration接口进行输出的
- 功能与Iterator类似,只是Enumeration中不存在删除数据的方法
- 通过调用hasMoreElements方法判断是否包含更多元素,通过调用nextElement方法返回系列的连续元素
public interface Enumeration<E>
//判断此枚举是否包含更多元素
boolean hasMoreElements();
//返回此枚举的下一个元素
E nextElement();
- 要想使用此接口可以通过Vector类,Vector类定义了elements方法可以为Enumeration实例化
public class Vector<E>
//返回此向量的组件的枚举
Enumeration<E> e=vector.elements();
二. 练习
1. Enumeration接口通过Vector类进行实例化
将1.txt、2.txt、3.txt这3个文件的内容合并到4.txt上
import java.util.*;
import java.io.*;
public class SequenceInputStreamDemo {
public static void main(String[] args) {
try{
sequenceStream();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void sequenceStream()throws IOException{
//1. 定义一个Vector集合
Vector<FileInputStream> v=new Vector<FileInputStream>();
v.add(new FileInputStream("C:\\1.txt"));
v.add(new FileInputStream("C:\\2.txt"));
v.add(new FileInputStream("C:\\3.txt"));
//2. 通过Vector集合的elements方法实例化Enumeration
Enumeration<FileInputStream> en=v.elements();
//3. 使用SequenceInputStream的构造方法实例化对象,参数是Enumeration对象
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream("C:\\4.txt");
byte[] buf=new byte[1024];
int len=0;
while ((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
2. Enumeration接口通过匿名内部类实现
不使用Vector来实例化Enumeration接口,而是通过匿名内部类实现Enumeration接口
import java.util.*;
import java.io.*;
public class SplitFileDemo {
public static void main(String[] args) {
try {
//切割文件
splitFile();
//合并文件
mergeFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//合并文件
private static void mergeFile() throws IOException {
//1. 定义一个ArrayList集合,存放多个输入流
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int i=1;i<=9;i++){
al.add(new FileInputStream("C:\\splitFiles\\"+i+".part"));
}
Iterator<FileInputStream> it=al.iterator();
//2. 匿名内部类实现Enumeration接口
Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() {
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public FileInputStream nextElement() {
return it.next();
}
};
//3. 使用SequenceInputStream的构造方法实例化对象,参数是Enumeration对象
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream("2.mp4");
int len=0;
byte[] buf=new byte[1024*1024];
while ((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
//切割文件
private static void splitFile() throws IOException {
FileInputStream fis=new FileInputStream("1.mp4");
FileOutputStream fos=null;
//将文件1.mp4按照1MB大小进行切割
byte[] buf=new byte[1024*1024];
int len=0;
int count=1;
while ((len=fis.read(buf))!=-1){
fos=new FileOutputStream("C:\\splitFiles\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}