关于文件合并,win上面有个命令,cmd type path*.txt >> path\merge.txt,这样就可以将path目录下的*.txt合并为merge.txt,但是我测试下来,效率很低。那咋办嘛,用java写一个吧。自己动手,丰衣足食。
代码
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.text.StrBuilder;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
/**
* 若干文本文件合并为一个文件
* 使用BufferedReader一行一行读取文件,内存占用小
*/
public class FileMergeJobs {
private final static String BASE_PATH = "D:/temp/merge/";// 存放需要合并的文件
private final static String FILE_NAME = "合并后的文件.sql";
private final static Integer WRITE_SPEED = 50 * 10000;// 一次文件写入行数,越大越快(推荐最多50w,多了会OOM)
public static void main(String[] args) throws IOException {
System.out.println("开始:" + DateUtil.now());
// ----------------------------------------
// 删除合并的文件
File fileMerge = new File(BASE_PATH + FILE_NAME);
FileUtil.del(fileMerge);
// 文件夹内所有文件
File[] files = FileUtil.ls(BASE_PATH);
// 新建合并的文件
FileWriter mergeWriter = FileWriter.create(fileMerge);
// 遍历写文件
for (File file : files) {
StrBuilder sb = StrBuilder.create();
int i = 0;
BufferedReader bufferedReader = FileReader.create(file).getReader();
String readLine;
while ((readLine = bufferedReader.readLine()) != null) {
sb.append(readLine).append("\n");
if (i >= WRITE_SPEED) {
mergeWriter.append(sb.toString());
sb.clear();
i = 0;
}
i++;
}
if (i > 0 && i <= WRITE_SPEED) {
mergeWriter.append(sb.toString());
sb.clear();
}
}
// ----------------------------------------
System.out.println("结束:" + DateUtil.now());
}
}
结果
若干文件汇总起来大概6个G的总大小,耗时情况在1分钟以内,而且是单线程跑的,这速度可以接受了