一、概述
1、SequenceInputStream对多个流进行合并。也被称为合并流。
2、常用构造函数
SequenceInputStream(Enumeration<?extends FileInputStream> e)
二、合并流 1、创建集合,并将流对象添加进集合
2、创建Enumeration对象,将集合元素加入。
3、创建SequenceInputStream对象,合并流对象
4、创建写入流对象,FileOutputStream关联写入文件
5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。
/*合并流
1、创建集合,并将流对象添加进集合
2、创建Enumeration对象,将集合元素加入。
3、创建SequenceInputStream对象,合并流对象
4、创建写入流对象,FileOutputStream关联写入文件
5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。
*/
import java.io.*;
import java.util.*;
class SequenceInputStreamDemo
{
public static void main(String[] args) throws IOException
{
File file = new File("D:\\5.txt");
show(file);
}
public static void show(File file)throws IOException{
//创建list集合,并指定FileInputStream类型,存储需要合并的流对象
List<FileInputStream> list = new ArrayList<FileInputStream>();
list.add(new FileInputStream("D:\\1.txt"));
list.add(new FileInputStream("D:\\2.txt"));
list.add(new FileInputStream("D:\\3.txt"));
list.add(new FileInputStream("D:\\4.txt"));
//通过使用迭代取出集合中的元素
Iterator<FileInputStream> it = list.iterator();
//因为SequenceInputStream的构造函数参数类型必须是Enumeration<? extends InputStream>
//而list是没有返回值类型是Enumeration,所以我们要自己建一个Emumeration
//因此可以使用匿名内部类,通过 new Enumeration建立子类对象,并覆盖Enumeration中的方法
//注:Enumeration的泛型必须是InputStream或其子类
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
public boolean hasMoreElements(){
//因为Enumeration的原理和迭代的原理是一致的,所以这里返回it.hasNext()就行了
return it.hasNext();
}
public FileInputStream nextElement(){
//注意,这里返回值类型必须和Enumeration定义的泛型一致,而且Enumeration的泛型必须是InputStream或其子类
return it.next();
}
};
//创建合并流对象,并把en作为实际参数传递
SequenceInputStream se = new SequenceInputStream(en);
BufferedOutputStream buf = null;
//创建输出流对象 ,这里也可以使用PrintStream打印流
buf = new BufferedOutputStream(new FileOutputStream(file));
byte [] bys = new byte[1024];
int by = 0;
while((by=se.read(bys))!=-1){
buf.write(bys,0,by);
}
se.close();
buf.close();
}
}
三、切割流
/*
切割流
*/
import java.io.*;
import java.util.*;
class SequenceInputStreamDemo1
{
public static void main(String[] args)
{
//要分割的文件
File file = new File("D:\\KuGou\\陈奕迅 - 斗战神.mp3");
//判断文件是否存在
if(file.exists())
sqlitMp3(file);
File outFile = new File("D:\\KuGou\\陈奕迅 - 斗战神_SequenceInputStream.mp3");
show(file,outFile);
}
//分割文件
public static void sqlitMp3(File file){
BufferedInputStream bufr = null;
BufferedOutputStream bufo = null;
int count = 1;
try
{
//创建字节读取流对象,关联文件
bufr = new BufferedInputStream(new FileInputStream(file));
//创建一个2M大小的数组,以数组大小对文件进行分割
byte [] bys = new byte[1024*1024*2];
int by = 0;
//没读取的字节达到2M就写出一次
while((by=bufr.read(bys))!=-1){
//使用count自增来保存分割的文件
bufo = new BufferedOutputStream(new FileOutputStream("D:\\KuGou\\陈奕迅_斗战神"+(count++)+".part"));
//写出碎片文件
bufo.write(bys,0,by);
//每写出一次,都要关流
bufo.close();
}
}
catch (IOException e)
{
throw new RuntimeException();
}
finally{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
finally{
try
{
if(bufo!=null)
bufo.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
}
}
}
//合并流
public static void show(File file,File outFile){
FileInputStream fi = null;
BufferedOutputStream bufo = null;
SequenceInputStream se = null;
//创建集合,用于存储被分割的文件
List<InputStream> list = new ArrayList<InputStream>();
try
{
//创建字节读取流,并于文件关联
fi = new FileInputStream(file);
//获取文件被分割的个数,fi.available得到文件大小除以2M得到文件被分割个数
int num =(int) Math.ceil(fi.available()/1024/1024/2.0);
for(int i=1;i<=num;i++){
list.add(new FileInputStream("D:\\KuGou\\陈奕迅_斗战神"+i+".part"));
}
//通过遍历集合,得到集合中的碎片文件
Iterator<InputStream> it = list.iterator();
//创建Enumeration对象,使用匿名对象,通过new Enumeration创建其子类对象
Enumeration<InputStream> en = new Enumeration<InputStream>(){
//覆盖抽象Enumeration类中的抽象方法
public boolean hasMoreElements(){
return it.hasNext();
}
public InputStream nextElement(){
return it.next();
}
};
//创建SequenceInputStream对象,将多个流合并成一个流
se = new SequenceInputStream(en);
//创建字节输出流,输出把合并后的文件打印
bufo = new BufferedOutputStream(new FileOutputStream(outFile));
//创建缓冲区,一次读取1M
byte [] bys = new byte[1024*1024];
int by = 0;
while((by=se.read(bys))!=-1){
bufo.write(bys,0,by);
}
}
catch (IOException e)
{
throw new RuntimeException();
}
finally{
try
{
if(fi!=null)
fi.close();
if(bufo!=null)
bufo.close();
if(se!=null)
se.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
}
}
}