public class ChunkAndMergeOfFile {
//分块测试
@Test
public void testChunk() throws Exception{
//源文件
File sourceFile = new File("D:\\作业视频\\实现员工管理系统(二).mp4");
//分块文件存储路径
String chunkFilePath = "D:\\testi\\chunk\\";
//设置分块文件的大小
int chunkFileSize = 1024 * 1024 * 5; //5MB
//设置分块个数
int chunkNum = (int) Math.ceil(sourceFile.length() * 1.0 / chunkFileSize);
//使用流读取源文件,向分块文件中写
RandomAccessFile raf_r = new RandomAccessFile(sourceFile, "r");
//缓存区
byte[] bytes = new byte[1024];
for (int i = 0; i < chunkNum; i++) {
File chunkFile = new File(chunkFilePath+i);
//分块文件写入流
RandomAccessFile raf_rw = new RandomAccessFile(chunkFile, "rw");
int len = -1;
while ((len=raf_r.read(bytes))!=-1){
raf_rw.write(bytes, 0, len);
if (chunkFile.length()>=chunkFileSize){
break;
}
}
raf_rw.close();
}
raf_r.close();
}
//合并测试
@Test
public void testMerge() throws Exception{
//分块文件目录
File chunkFolder = new File("D:\\testi\\chunk");
//帮助检验合并文件的完整性
File sourceFile = new File("D:\\作业视频\\实现员工管理系统(二).mp4");
//合并后的文件
File mergeFile = new File("D:\\testi\\实现员工管理系统(二).mp4");
//取出所有的分块文件
File[] files = chunkFolder.listFiles();
//将数组转换为集合
List<File> chunkList = Arrays.asList(files);
//将分块文件进行排序(升序)
Collections.sort(chunkList,(File o1,File o2)->Integer.parseInt(o1.getName())-Integer.parseInt(o2.getName()));
//合并文件写入流
RandomAccessFile raf_rw = new RandomAccessFile(mergeFile, "rw");
//缓存区
byte[] bytes = new byte[1024];
//遍历分块文件,向合并文件中写入
for (File file : chunkList) {
//读分块的流
RandomAccessFile raf_r = new RandomAccessFile(file, "r");
int len = -1;
while ((len=raf_r.read(bytes))!=-1){
raf_rw.write(bytes,0,len);
}
raf_r.close();
}
raf_rw.close();
//合并完成之后检验文件的完整性
FileInputStream source_fis = new FileInputStream(sourceFile);
FileInputStream merge_fis = new FileInputStream(mergeFile);
String md5_source = DigestUtils.md5Hex(source_fis);
String md5_merge = DigestUtils.md5Hex(merge_fis);
if (md5_merge.equals(md5_source)){
System.out.println("合并文件成功!");
}
}
}
文件的分块与合并
最新推荐文章于 2023-06-02 17:11:10 发布