一、文件拆分的思路:
定义好每块文件的大小,先根据文件大小,计算出块数,然后把每一块读入缓冲区,从缓冲区写到定好的目录中
public static void main(String[] args) throws IOException {
//源文件地址
File sourceFile = new File("E:\\chunck\\share.mp4");
//块文件目录
String chunkFileFolder = "E:\\chunck\\chunks";
//块文件大小
int chunkFileSize = 1 * 1024 * 1024;
//块文件数量
int chunkFileNum = (int) Math.ceil(sourceFile.length() * 1.0 / chunkFileSize);
//
RandomAccessFile readFile = new RandomAccessFile(sourceFile, "r");
byte[] bytes = new byte[1024];
for(int i = 0; i < chunkFileNum; i++) {
File chunkFile = new File(chunkFileFolder + "\\" + i);
int len = -1;
//创建块文件
RandomAccessFile writeFile = new RandomAccessFile(chunkFile, "rw");
while((len = readFile.read(bytes)) != -1) {
writeFile.write(bytes, 0 ,len);
//如果块文件大小达到1M,就读下一块
if(chunkFile.length() >= chunkFileSize) {
break;
}
}
writeFile.close();
}
readFile.close();
}
二、文件合并的思路
把拆分后的文件,先按照名称排序,防止合并的时候顺序错乱,导致文件损坏。
public static void main(String[] args) throws IOException {
//块文件目录
String chunkFileFolderPath = "E:\\chunck\\chunks";
//获取块文件对象
File chunkFileFolder = new File(chunkFileFolderPath);
//块文件列表
File[] files = chunkFileFolder.listFiles();
//将文件排序
List<File> filesList = Arrays.asList(files);
Collections.sort(filesList, (o1, o2) -> {
if(Integer.parseInt(o1.getName()) > Integer.parseInt(o2.getName())){
return 1;
}
return -1;
});
//合并后的文件
File mergerFile = new File("E:\\chunck\\share_merger.mp4");
//创建新文件
boolean newFile = mergerFile.createNewFile();
//创建写对象
RandomAccessFile writeFile = new RandomAccessFile(mergerFile, "rw");
byte[] b = new byte[1024];
for(File chunkFile : filesList){
int len = -1;
//创建读块文件的对象
RandomAccessFile readFile = new RandomAccessFile(chunkFile, "r");
while((len = readFile.read(b)) != -1){
writeFile.write(b, 0, len);
}
readFile.close();
}
writeFile.close();
}
在文件上传下载的时候,会遇到断点续传的问题,可以根据文件的拆分和合并的思路实现断点续传的功能