前面的字节流和字符流和缓冲流都是对文本文件的输入输出
这次要讲的是序列流 SequenceInputStream
Enumeration是其中很重要的一部分
目的是完成文件的内容合并
序列流也分两类1.是将两个文本文件合并:
// 使用SequenceInputStream合并文件。
public static void merge2() throws IOException{
//找到目标文件
File inFile1 = new File("F:\\a.txt");
File inFile2 = new File("F:\\b.txt");
File outFile = new File("F:\\c.txt");
//建立数据的输入输出通道
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
FileInputStream fileInputStream1 = new FileInputStream(inFile1);
FileInputStream fileInputStream2 = new FileInputStream(inFile2);
//建立序列流对象
SequenceInputStream inputStream = new SequenceInputStream(fileInputStream1,fileInputStream2);
byte[] buf = new byte[1024];
int length = 0 ;
while((length = inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//关闭资源
inputStream.close();
fileOutputStream.close();
}
2.两个以上的文件合并:
注意:2个以上的时候主要是Enumeration这个迭代器的问题
SequenceInputStream需要传入Enumeration**对象**
public static void main(String[] args) throws IOException {
File file1=new File("D:\\xx1.txt");
File file2=new File("D:\\xx2.txt");
File file3=new File("D:\\xx3.txt");
File file4=new File("D:\\xx4.txt");
FileOutputStream fileOutputStream4=new FileOutputStream(file4);
FileInputStream fileInputStream1=new FileInputStream(file1);
FileInputStream fileInputStream2=new FileInputStream(file2);
FileInputStream fileInputStream3=new FileInputStream(file3);
List<FileInputStream> list=new ArrayList<FileInputStream>();
list.add(fileInputStream1);
list.add(fileInputStream2);
list.add(fileInputStream3);
final Iterator<FileInputStream> iterator=list.iterator();
SequenceInputStream sequenceInputStream=new SequenceInputStream(new Enumeration<FileInputStream>() {
@Override
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return iterator.hasNext();
}
@Override
public FileInputStream nextElement() {
// TODO Auto-generated method stub
return iterator.next();
}
});
byte[] buffer=new byte[1014];
int len=0;
while((len=sequenceInputStream.read(buffer))!=-1) {
System.out.println(new String(buffer,0,len));
fileOutputStream4.write(buffer,0,len);
}
sequenceInputStream.close();
fileOutputStream4.close();
}
或者
//把三个文件合并成一个文件
public static void merge3() throws IOException{
//找到目标文件
File file1 = new File("F:\\a.txt");
File file2 = new File("F:\\b.txt");
File file3 = new File("F:\\c.txt");
File file4 = new File("F:\\d.txt");
//建立对应 的输入输出流对象
FileOutputStream fileOutputStream = new FileOutputStream(file4);
FileInputStream fileInputStream1 = new FileInputStream(file1);
FileInputStream fileInputStream2 = new FileInputStream(file2);
FileInputStream fileInputStream3 = new FileInputStream(file3);
//创建序列流对象
Vector<FileInputStream> vector = new Vector<FileInputStream>();
vector.add(fileInputStream1);
vector.add(fileInputStream2);
vector.add(fileInputStream3);
Enumeration<FileInputStream> e = vector.elements();
SequenceInputStream sequenceInputStream = new SequenceInputStream(e);
//读取文件数据
byte[] buf = new byte[1024];
int length = 0;
while((length = sequenceInputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//关闭资源
sequenceInputStream.close();
fileOutputStream.close();
}
练习:
把一个MP3切割成n份 然后再把这些文件合并起来
public class Demo2 {
public static void main(String[] args) throws IOException {
split(new File("c:\\a.mp3"), 10, new File("c:\\"));
System.out.println("切割完毕");
LinkedHashSet<InputStream> hs = new LinkedHashSet<InputStream>();
hs.add(new FileInputStream(new File("c:\\part.1.mp3")));
hs.add(new FileInputStream(new File("c:\\part.2.mp3")));
hs.add(new FileInputStream(new File("c:\\part.3.mp3")));
hs.add(new FileInputStream(new File("c:\\part.4.mp3")));
merage(hs, new File("c:\\merage.mp3"));
System.out.println("合并完毕");
}
private static void merage(LinkedHashSet<InputStream> hs, File dest)
throws IOException {
final Iterator<InputStream> it = hs.iterator();
FileOutputStream fos = new FileOutputStream(dest);
SequenceInputStream seq = new SequenceInputStream(
new Enumeration<InputStream>() {
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public InputStream nextElement() {
return it.next();
}
});
byte[] byt = new byte[1024 * 1024];
int len = 0;
while ((len = seq.read(byt)) != -1) {
fos.write(byt, 0, len);
}
seq.close();
fos.close();
}
// 1. 切割文件
/*
* 切割文件,切割份数, 切割后保存路径
*/
private static void split(File src, int count, File dir) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = null;
byte[] byt = new byte[1024 * 1024];
int len = 0;
for (int i = 1; i <= count; i++) {
len = fis.read(byt);
if (len != -1) {
fos = new FileOutputStream(dir + "part." + i + ".mp3");
fos.write(byt, 0, len);
}
// fos.close();
}
fis.close();
}
}