按行拆分文本文件与合并文本文件---I/O流---java

时间:2021-06-18 13:33:17

背景


  • 在进行自然语言处理的中文词性标注时   进行测试时由于测试数据文本行数较多  而且测试每次标注一行的用时稍长
  • 如果一次将文件读进来测试机器运行时间要连续不能中断  而且 只能一台机器进行工作
  • 于是想到分布式的方式  将大文件拆分成小文件  分别用于测试  再将得到的结果文件 合并成 一个大文件 用于评估

拆分文本文件


  • 在此文件的文件夹进入powershell   使用如下命令进行拆分
//             源文件  目标文件  拆分的个数
java splitfile fromfile tofiles subfilenumber
  • 详细代码
public class splitfile {

    public static void main(String[] args) throws Exception{
DoFile dofile = new DoFile();
// 源文件 目标文件 拆分的个数
//dofile.splitfile("test.dat", "subtest/test", 10);
dofile.splitfile(args[0], args[1], Integer.parseInt(args[2])); } }
public class DoFile {

    public int getrows(File file) throws IOException{
int rows = 0;
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
for (rows = 0; br.readLine() != null; rows++);
br.close();
return rows;
} public void splitfile(String from, String to, int subfilenum) throws IOException{
File fromfile = new File(from); if (!fromfile.exists()) {
throw new IOException(fromfile + "不存在!!!");
}
if (!fromfile.isFile()) {
throw new IOException(fromfile + "不是文件!!");
}
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(fromfile))); String str = null;
int filerows = getrows(fromfile);
int subrows = (int) Math.ceil(1.0 * filerows / subfilenum); for (int i = 0; i < subfilenum; i++) { PrintWriter pw = new PrintWriter(to + "-" + i + ".dat");
int row = 0;
System.out.println("生成第:" + (i+1) + "个文件");
while(row < subrows) { if ((str = br.readLine()) != null) {
pw.println(str);
row++;
}else {
pw.flush();
pw.close();
break;
} }
pw.flush();
pw.close();
} br.close();
System.out.println("文件拆分完成!");
}
}

  • 测试结果

按行拆分文本文件与合并文本文件---I/O流---java

按行拆分文本文件与合并文本文件---I/O流---java

按行拆分文本文件与合并文本文件---I/O流---java


合并文本文件


  • 在此文件的文件夹进入powershell   使用命令
//装待合并的文件的文件夹  生成的新的文件
java mergefile dir newfile
  • 详细代码
public class mergefile {

    public static void main(String[] args) throws Exception{
DoFile dofile = new DoFile(); //合并文件 装小文件的文件夹 大文件
dofile.mergefile(args[0], args[1]);
} }
public class DoFile {

    //按行   合并文件    给定已知文件夹
public void mergefile(String dirname, String finalfile) throws IOException{
File dir = new File(dirname);
if (!dir.exists()) {
throw new IOException(dir + "不存在!!");
}
if (!dir.isDirectory()) {
throw new IOException(dir + "不是文件夹");
}
FileOutputStream out = new FileOutputStream(finalfile, true);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(out));
int i = 1;
String[] files = dir.list(); for(String string: files) {
System.out.println("合并到第:" + i++ + "个文件");
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(dir + "/"+ string)));
String str = null;
while((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
}
br.close();
}
bw.flush();
bw.close();
System.out.println("文件合并完成!"); } }

  • 测试结果

按行拆分文本文件与合并文本文件---I/O流---java

按行拆分文本文件与合并文本文件---I/O流---java