public class BigFileTest {
@Test
public void testChunk() throws IOException {
File sourceFile = new File("D:\develop\chunk\001-ChatGPT背景介绍.mp4");
String chunkPath = "D:\develop\chunk_target\";
if(!sourceFile.exists()){
sourceFile.mkdirs();
}
long chunkSize = 1024 * 1024 * 1;
long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / chunkSize);
System.out.println("分块总数:"+chunkNum);
byte[] bytes = new byte[1024];
RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");
for (int i = 0; i < chunkNum ; i++) {
File file = new File(chunkPath + i);
if(file.exists()){
file.delete();
}
boolean newFile = file.createNewFile();
if(newFile){
RandomAccessFile raf_write = new RandomAccessFile(file, "rw");
int len = -1;
while ((len = raf_read.read(bytes)) != -1){
raf_write.write(bytes,0,len);
if(file.length() >= chunkSize){
break;
}
}
raf_write.close();
System.out.println("完成分块"+i);
}
}
raf_read.close();
}
@Test
public void testMerge() throws IOException {
File chunkFolder = new File("D:\develop\chunk_target");
File originalFile = new File("D:\develop\chunk\001-ChatGPT背景介绍.mp4");
File mergeFile = new File("D:\develop\chunk\1.mp4");
if (mergeFile.exists()) {
mergeFile.delete();
}
mergeFile.createNewFile();
RandomAccessFile raf_write = new RandomAccessFile(mergeFile, "rw");
raf_write.seek(0);
byte[] bytes = new byte[1024];
File[] files = chunkFolder.listFiles();
List<File> fileList = Arrays.asList(files);
Collections.sort(fileList, (o1, o2) -> Integer.parseInt(o1.getName()) - Integer.parseInt(o2.getName()));
for (File chunkFile : fileList) {
Integer len = -1;
RandomAccessFile raf_read = new RandomAccessFile(chunkFile , "r");
while ((len = raf_read.read(bytes)) != -1){
raf_write.write(bytes,0,len);
}
raf_read.close();
}
raf_write.close();
try(FileInputStream fileInputStream = new FileInputStream(originalFile);
FileInputStream mergeFileStream = new FileInputStream(mergeFile)) {
String originalMd5 = DigestUtils.md5Hex(fileInputStream);
String mergeFileMd5 = DigestUtils.md5Hex(mergeFileStream);
if(originalMd5.equals(mergeFileMd5)){
System.out.println("合并文件成功");
}else {
System.out.println("合并文件失败");
}
}
}
}