废话不多说系列:直接上源码,利用Java 程序实现文件的切分与合并业务需求。
一、完整源码
import org.springframework.util.ObjectUtils;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Objects;
import java.util.UUID;
/**
* 文件分割和合并工具类
*
* @author zl
* @create 2021-05-16 9:55
*/
public class FileSplitAndMergeUtil {
public static void main(String[] args) throws Exception {
String srcFile = "D:/splitFile/src.pdf";
String targetDir = "D:/splitFile/merge_" + UUID.randomUUID().toString() + "/";
String outDir = "D:/splitFile/";
// 拆分文件
split(new File(srcFile), 1024 * 100, targetDir);
// 合并文件
merge(targetDir, outDir);
}
/**
* 拆分文件
*
* @param f 文件
* @param fileLength 拆分后的每个文件最大大小(例如 fileLength=1024 * 100,即切分为 100K大小的文件)
* @param targetDir 拆分好的文件的存放目录(例如 "src/test/resources/file/" )
*/
public static void split(File f, long fileLength, String targetDir) throws IOException {
RandomAccessFile src = new RandomAccessFile(f, "r");
int numberOfPieces = (int) (src.length() / fileLength) + 1;
int len = -1;
byte[] b = new byte[1024];
if (!new File(targetDir).exists()) {
if (new File(targetDir).mkdir()) {
System.out.println("创建目录成功");
} else {
System.out.println("创建目录失败");
return;
}
}
for (int i = 0; i < numberOfPieces; i++) {
String name = targetDir + f.getName() + "." + (i + 1);
File file = new File(name);
RandomAccessFile dest = new RandomAccessFile(file, "rw");
while ((len = src.read(b)) != -1) {
dest.write(b, 0, len);
//如果太大了就不在这个子文件写了 换下一个
if (dest.length() > fileLength) {
break;
}
}
dest.close();
}
System.out.println("分割文件成功");
src.close();
}
/**
* 文件合并
*
* @param targetDir 切分后的子文件目录(例如 "src/test/resources/file/")
* @param outDir 合并后的文件目录(例如 "src/test/resources/file/merge")
* @throws IOException I/O异常
*/
public static void merge(String targetDir, String outDir) throws IOException {
// 1.检查文件夹目录下是否存在文件
File dir = new File(targetDir);
if (dir.isFile()) {
System.out.println("error: 传入的是一个文件,应该传入一个文件夹目录地址!");
return;
}
if (dir.isDirectory() && ObjectUtils.isEmpty(dir.listFiles())) {
System.out.println("error: 传入的文件夹目录地址为空,里面无任何文件!");
return;
}
// 2.准备合并后的文件相关信息
File file = new File(outDir + "new-" + UUID.randomUUID().toString().replaceAll("-", "") + ".pdf");
RandomAccessFile in = new RandomAccessFile(file, "rw");
in.setLength(0);
in.seek(0);
byte[] bytes = new byte[1024];
int len = -1;
// 3.将指定目录下的所有文件合并起来
for (File listFile : Objects.requireNonNull(dir.listFiles())) {
RandomAccessFile out = new RandomAccessFile(listFile, "rw");
while ((len = out.read(bytes)) != -1) {
in.write(bytes, 0, len);
}
out.close();
}
System.out.println("合并文件成功");
in.close();
}
}
二、测试示例
(1)准备好一个资源文件
(2)main 执行结果
程序执行结果如下:
merge-* 为切割后文件存放的目录, new-* 为合并后的新文件
文件src.pdf 切割后的文件
至此,谢谢阅读!