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


    背景


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

    拆分文本文件


    • 在此文件的文件夹进入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("文件拆分完成!");
        }
    }

    • 测试结果


    合并文本文件


    • 在此文件的文件夹进入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("文件合并完成!");
                
        }   
        
    }

    • 测试结果

  • 相关阅读:
    oracle 触发器的编写
    单例类与常见双下方法
    实现高效率的冒泡排序
    面向对象基础(五)
    面向对象基础(四)
    面向对象基础(三)
    面向对象基础(二)
    面向对象(基础)
    四指针法
    因数法
  • 原文地址:https://www.cnblogs.com/xinglichao/p/8985789.html
Copyright © 2020-2023  润新知