package com.lzw.flieslice;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 文件切片和文件合并
*/
public class FileSlice {
// 文件合并
private void fileComposite(String destDir) throws Exception {
// 找到所有的文件切片
Path path = Paths.get(destDir);
List<Path> pathList = Files.list(path).sorted((o1, o2) -> {
String f1 = o1.toString();
String f2 = o2.toString();
String f1Name = f1.substring(f1.lastIndexOf("\\") + 1, f1.lastIndexOf("."));
String f2Name = f2.substring(f2.lastIndexOf("\\") + 1, f2.lastIndexOf("."));
return Integer.parseInt(f1Name) - Integer.parseInt(f2Name);
}).collect(Collectors.toList()); // 其实这个地方要做排序操作
RandomAccessFile newFile = new RandomAccessFile(destDir + "test.rar", "rw");
// 遍历所有的文件
long position = 0;
for (Path fp : pathList) {
// 读取文件中的内容
File file = fp.toFile();
System.out.println(file.getName());
RandomAccessFile accessFile = new RandomAccessFile(file, "r");
FileChannel fileChannel = accessFile.getChannel();
long fileSize = fileChannel.size();
byte[] bs = new byte[(int) fileSize];
accessFile.read(bs);
newFile.seek(position);
newFile.write(bs);
position += fileSize;
fileChannel.close();
}
newFile.close();
}
// 文件切割,每个文件分片大小为 1mb
private void fileSlice(String srcPath, String destDir, long sliceSize) throws Exception {
RandomAccessFile file = new RandomAccessFile(srcPath, "rw");
// 获取文件大小
long size = file.getChannel().size();
long indexSeek = 0;
int fileIndex = 1;
while (size > 0) {
// 文件slice size
if (size < sliceSize) {
sliceSize = size;
}
byte[] sliceByte = new byte[(int) sliceSize];
file.seek(indexSeek);
file.read(sliceByte);
indexSeek = file.getChannel().position();
size = size - sliceSize;
// 保存切片文件
RandomAccessFile newFile = new RandomAccessFile(destDir + fileIndex + ".rar", "rw");
newFile.write(sliceByte);
newFile.close();
fileIndex ++;
}
file.close();
}
public static void main(String[] args) throws Exception {
String srcPath = "D:/test/test.rar";
String destDir = "D:/test/slice/";
long sliceSize = 1024 * 1024 * 10; // 每个分片大小
FileSlice fileSlice = new FileSlice();
fileSlice.fileSlice(srcPath, destDir, sliceSize);
fileSlice.fileComposite(destDir);
}
}