需求: 某文件太大, 需要拆分保存, 问如何快速拆分? 拆分后如何完整合并?
使用的java类: RandomAccessFile
=========================================================
拆分思路:
一个''输入流''--->分内容到: 多个''输出流''
合并思路:
多个''输入流''---->合并内容到: 一个''输出流''
=========================================================
// 按照指定位置, 大小, 拆分某文件
private static void split(String srcFile, String destDir, int fileSize) throws Exception {
// 创建文件对象
File src = new File(srcFile);
File destFolder = new File(destDir);
if (!destFolder.exists()) {
destFolder.mkdirs();
}
RandomAccessFile rand = new RandomAccessFile(src, "r");// 输入流
// 计算拆分后文件的: 个数
double size = fileSize * 1024 * 1024;// MB-->byte
int count = (int) Math.ceil(src.length() / size);
// 拆分文件
String srcName = src.getName();
byte[] buf = new byte[(int) size];
int len = 0;
for (int i = 1; i <= count; i++) {
// 定义拆分后的文件
File destFile = new File(destDir, srcName + ".part" + i);
destFile.createNewFile();// 创建空的目标文件
RandomAccessFile dest = new RandomAccessFile(destFile, "rw");// 输出流
// 拷贝文件
len = rand.read(buf);
dest.write(buf, 0, len);
dest.close();
}
// 关闭资源
rand.close();
System.out.println("split ok..\n");
}
//合并文件
private static void merge(String srcDir, String destDir) throws Exception {
// 多个输入流==>一个输出流
File src = new File(srcDir);
File[] files = src.listFiles();
Arrays.sort(files, new Comparator<File>() {
public int compare(File f1, File f2) {
int index=f1.getName().lastIndexOf(".part");
int num=Integer.parseInt(f1.getName().substring(index+5));
int index2=f2.getName().lastIndexOf(".part");
int num2=Integer.parseInt(f2.getName().substring(index2+5));
return num-num2;
}
});
String formerName = "";
for (File f : files) {
if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
formerName = f.getName().replaceAll(".part\\d", "");
break;
}
}
// 创建:一个输入流
File formerFile = new File(destDir, formerName);
System.out.println("原文件名==="+formerName);
File parentFile = formerFile.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();// 创建父目录
}
if (!formerFile.exists()) {
formerFile.createNewFile();
}
RandomAccessFile randTo = new RandomAccessFile(formerFile, "rw");// 输入流
// 创建:多个输出流
byte[] buf = new byte[1024];
int len = 0;
for (File f : files) {
if (f.isFile() && f.getName().lastIndexOf(".part") != -1) {
System.out.println("merge拆分的文件----"+f.getName());;
RandomAccessFile source = new RandomAccessFile(f, "r");// 输入流
while ((len = source.read(buf)) != -1) {
randTo.write(buf, 0, len);
}
source.close();// 关闭资源
}
}
randTo.close();// 关闭资源
System.out.println("merge ok...");
}
测试及结果
public static void main(String[] args) throws Exception {
// 拆
split("/home/wang/a.tar.gz","aa",30);//15MB
// 合
merge("aa", "bb");
}