文件的切割与合并练习

时间:2021-09-08 05:34:51
/*
 * 文件的切割与合并练习
 * 为简化程序,不对异常进行处理,全部声明抛出
 */


package sequence_input_stream;


import java.io.*;
import java.util.*;


public class FileSM {


public static void main(String[] args) throws IOException {

//文件源目录
File src = new File("C:\\Users\\Administrator\\Desktop\\file_split_merge");
//封装用于分割的文件
File filename = new File(src, "Vitas - 星星.mp3");

fileSplit(filename); //文件分割

fileMerge(src, "Vitas - 星星2.mp3"); //文件合并

}


//文件切分方法
public static void fileSplit(File file) throws IOException{
//将文件关联到输入流
FileInputStream fis = new FileInputStream(file);

byte[] buf = new byte[1024 * 1024]; //定义分片大小

int len = 0; //用于记录所读到的字节数
int count = 1; //标示分片

while((len = fis.read(buf)) != -1){ //简单的文件输出流操作
FileOutputStream fos = new FileOutputStream(new File(file.getParentFile(), count++ + ".segment"));
fos.write(buf, 0, len);
fos.close();
}

fis.close();
}

//文件合并方法,参数file父目录,filename合并后的文件名
public static void fileMerge(File file, String filename) throws IOException{

//定义集合,保存要合并的数据流
ArrayList<FileInputStream> inarr = new ArrayList<FileInputStream>();
//添加数据流
// for(int i = 1; i <= 4; i++){
// inarr.add(new FileInputStream(
// new File("C:\\Users\\Administrator\\Desktop\\file_split_merge\\" + i + ".segment")));
// }
//当前目录为同一文件的碎片
File[] files = file.listFiles();
for(File part : files){
inarr.add(new FileInputStream(
new File(file, part.getName())));
}

//获取集合的迭代器,用于Enumeration的使用 //final
final Iterator<FileInputStream> it = inarr.iterator();
//定义匿名Enumeration对象,要访问Iterator需要将Iterator设置为final类型
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){


@Override
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return it.hasNext();
}


@Override
public FileInputStream nextElement() {
// TODO Auto-generated method stub
return it.next();
}

};

//合并流
SequenceInputStream sis = new SequenceInputStream(en);

//定义输出流对象,关联输出文件
FileOutputStream fos =
new FileOutputStream(new File(file, filename));

//定义缓冲字节
byte[] by = new byte[1024];
int len = 0;
//循环输出
while((len = sis.read(by)) != -1){
fos.write(by, 0, len);
}

//关闭资源
sis.close();
fos.close();


}
}