• 用java实现大文件分割、排序、合并


    import java.io.BufferedReader;  
    import java.io.BufferedWriter;  
    import java.io.FileNotFoundException;  
    import java.io.FileReader;  
    import java.io.FileWriter;  
    import java.io.IOException;  
    import java.util.Collections;  
    import java.util.Iterator;  
    import java.util.LinkedList;  
    import java.util.Random;  
      
    public class LargeMappedFiles {  
        /** 
          * 大数据排序合并 
          *  
          * @param args 
          */  
         public static void main(String[] args) throws IOException {  
          // 写入文件的路径  
          String filePath = "D:\456";  
          // 切分文件的路径  
          String sqlitFilePath = "D:\456\123";  
          //数据的个数  
          int CountNumbers=10000000;  
            
          //子文件的个数  
          int CountFile=10;  
            
          //精度  
          int countAccuracy=30*CountFile;  
            
          long startNumber=System.currentTimeMillis();  
          // 写入大数据文件  
          WriteData(filePath,CountNumbers);  
          System.out.println("存储完毕");  
            
          // 将大数据文件切分到另外的十个小文件中  
          sqlitFileDate(filePath, sqlitFilePath,CountFile);  
          System.out.println("文件切割完毕!");  
          // 把每个文件的数据进行排序  
          singleFileDataSort(sqlitFilePath,CountFile);  
          System.out.println("每个子文件排序完毕!");  
            
          //精度调整,十个文件数据进行比较整合  
          deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);  
          System.out.println("整合完毕");  
          long stopNumber=System.currentTimeMillis();  
          System.out.println("耗时"+(stopNumber-startNumber)/1000+"毫秒");  
         }  
         // 写入大数据文件  
         public static void WriteData(String path,int CountNumbers) throws IOException {  
          path = path + "\12114.txt";  
          FileWriter fs = new FileWriter(path);  
          BufferedWriter fw=new BufferedWriter(fs);  
          for (int i = 0; i < CountNumbers; i++) {  
           fw.write(new Random().nextInt(Integer.MAX_VALUE) + " ");  
          }  
          fw.close();  
          fs.close();  
            
         }  
         // 将大数据文件切分到另外的十个小文件中  
         public static void sqlitFileDate(String filepath, String sqlitPath,  
           int CountFile) throws IOException {  
          FileWriter fs = null;  
          BufferedWriter fw=null;  
          FileReader fr = new FileReader(filepath + "\12114.txt");  
          BufferedReader br = new BufferedReader(fr); // 读取获取整行数据  
            
          int i = 1;  
          LinkedList WriterLists=new LinkedList();    //初始化文件流对象集合  
          LinkedList fwLists=new LinkedList();  
          for (int j = 1; j <= CountFile; j++) {  
             
            //声明对象  
            fs = new FileWriter(sqlitPath + "\12" + j + ".txt",false);  
            fw=new BufferedWriter(fs);  
              
              
            //将对象装入集合  
            WriterLists.add(fs);  
            fwLists.add(fw);  
          }  
          //判断是文件流中是否还有数据返回  
          while (br.ready()) {  
             
           int count=1;//初始化第一文件流  
           for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {  
            BufferedWriter type = (BufferedWriter) iterator.next();  
            if(i==count)//判断轮到第几个文件流写入数据了  
            {  
             //写入数据,跳出,进行下一个文件流,下一个数据的写入  
             type.write(br.readLine() + " ");  
             break;  
            }  
            count++;  
           }  
           //判断是否到了最后一个文件流了  
           if (i >= CountFile) {  
            i = 1;  
           } else  
            i++;  
          }  
          br.close();  
          fr.close();  
          for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {  
           BufferedWriter object = (BufferedWriter) iterator.next();  
           object.close();  
          }  
          //遍历关闭所有子文件流  
          for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {  
           FileWriter object = (FileWriter) iterator.next();  
           object.close();  
          }  
         }  
         // 把每个文件的数据进行排序  
         public static void singleFileDataSort(String path1,int CountFile) throws IOException {  
          LinkedList nums = null;  
          for (int i = 1; i <= CountFile; i++) {  
           nums = new LinkedList();  
           String path = path1 + "\12" + i + ".txt";  
           try {  
            FileReader fr = new FileReader(path);  
            BufferedReader br = new BufferedReader(fr);  
            while (br.ready()) {  
             // 将读取的单个数据加入到集合里面  
             nums.add(Integer.parseInt(br.readLine()));  
            }  
            // 对集合进行排序  
            Collections.sort(nums);  
            // 将排序好的数据写入源文件  
            numberSort(nums, path);  
            br.close();  
            fr.close();  
           } catch (NumberFormatException e) {  
            e.printStackTrace();  
           } catch (FileNotFoundException e) {  
            e.printStackTrace();  
           } catch (IOException e) {  
            e.printStackTrace();  
           }  
          }  
         }  
         // 对每个文件数据进行排序,再写入源文件  
         public static void numberSort(LinkedList list, String path) {  
          try {  
           FileWriter fs = new FileWriter(path);  
           BufferedWriter fw=new BufferedWriter(fs);  
           for (Iterator iterator = list.iterator(); iterator.hasNext();) {  
            Object object = (Object) iterator.next();  
            fw.write(object + " ");  
           }  
           fw.close();  
           fs.close();  
          } catch (IOException e) {  
           e.printStackTrace();  
          }  
         }  
         // 文件数据最终整合(精度调整)  
         public static void deathDataFile(String filepath, String sqlitFilePath1,  
           int countAccuracy, int CountFile) throws IOException {  
          LinkedList nums = new LinkedList();                                       //添加数据,进行排序  
          Object temp = null;                                                       // 记录每次排序剩下的最后一个数字  
          boolean ispass = false;  
          LinkedList ispasses = null;                                               //记录数据文件的状态信息  
          FileWriter fs = new FileWriter(filepath + "\Sort.txt", false);           //创建文件流,以便整合的数据写入  
          BufferedWriter bw=new BufferedWriter(fs);  
          FileReader fr = null;                                                     //声明读取文件流  
          BufferedReader br = null;                                                 //声明BufferedReader  
          LinkedList WriterLists = new LinkedList(); // 初始化文件流对象集合  
          LinkedList WriterListFile = new LinkedList();  
          for (int j = 1; j <= CountFile; j++) {  
           // 声明对象,开启所有子文件流访问所有子文件的数据  
           fr = new FileReader(sqlitFilePath1 + "\12" + j + ".txt");  
             
           //开启所有BufferedReader,方便下次的整行的读取  
           br = new BufferedReader(fr);  
             
           // 将所有 FileReader对象装入集合  
           WriterListFile.add(fr);  
             
           // 将所有 BufferedReader对象装入集合  
           WriterLists.add(br);  
          }  
          for (;;) {  
           // 将十个源文件的是否有数据情况存入集合,以方便后面做判断  
           ispasses = new LinkedList();  
             
           // 分别读取十个源文件的单个数据  
           for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {  
            BufferedReader object = (BufferedReader) iterator.next();  
            Object obj = null;  
            while (object.ready()) {  
             //添加所有文件流的每次的数据  
             nums.add(Integer.parseInt(object.readLine().toString()));  
             break;  
            }  
            if (object.ready() == false)  
             ispasses.add("true");           //将各文件中的数据状态存入集合中  
           }  
             
           // 决断是否是第一次进来  
           if (nums.size() % countAccuracy == 0 && ispass == false) {  
            // 对集合进行排序  
            Collections.sort(nums);  
            // 接收最大的数据,其它的数据写入总排序文件  
            temp = numberSortData(nums, filepath, false, countAccuracy, bw);  
              
            //重新初始化集合  
            nums = new LinkedList();  
            // 添加上一组比较剩下的数据  
            nums.add(temp);  
            ispass = true;  
            // 记录源文件的数据数量,以便下次的遍历  
            continue;  
           }  
           if (ispass) {  
            if (nums.size() % countAccuracy == 1 && nums.size() > 1) {  
             // 对集合进行排序  
             Collections.sort(nums);  
             // 接收最大的数据,其它的数据写入总排序文件  
             temp = numberSortData(nums, filepath, true, countAccuracy,  
               bw);  
             nums = new LinkedList();  
             nums.add(temp);  
             continue;  
            }  
           }  
           // 记录下一组数据的位置  
           // 判断是不是十个文件都没有数据  
           if (ispasses.size() == CountFile) {  
            Collections.sort(nums);  
            temp = numberSortData(nums, filepath, true, countAccuracy, bw);  
            nums = new LinkedList();  
            break;  
           }  
          }  
          bw.close();  
          //关闭写入流  
          fs.close();  
            
          //关闭所有的BufferedReader  
          for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {  
           BufferedReader object2 = (BufferedReader) iterator.next();  
           object2.close();  
          }  
            
          //关闭所有的FileReader  
          for (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {  
           FileReader object = (FileReader) iterator.next();  
           object.close();  
          }  
         }  
         // 对数据进行排序,写入最终文件中(精度调整)  
         public static Object numberSortData(LinkedList list, String filePath,  
           boolean ispass, int countAccuracy,BufferedWriter fs) {  
          Object temp = 0;                                                        //记录最后一个值  
          int tempCount = 0;                                                      //记录写入的数据位置  
          try {  
           for (Iterator iterator = list.iterator(); iterator.hasNext();) {  
            Object object = (Object) iterator.next();  
            // 判断是否是最后一个数  
            if (tempCount == list.size() - 1) {  
             // 判断集合里面不足一百個數了  
             if (list.size() < countAccuracy + 1 && ispass) {  
              temp = null;  
             } else {  
              temp = object;  
              break;  
             }  www.2cto.com
            }  
            // 写入数据源  
            fs.write(object + " ");  
            // 记录数据的下标  
            tempCount++;  
           }  
          } catch (IOException e) {  
           e.printStackTrace();  
          }  
          return temp;  
         }  
    }  
  • 相关阅读:
    Java斗地主--001版本
    集合----方法的可变参数
    浅谈--Java编译期异常+运行期异常
    JavaSE编程基础(一)
    JavaSE编程基础(三)
    JavaSE编程基础(二)
    软件测试(三十)
    软件测试(二十九)
    软件测试(二十七)
    软件测试(二十八)
  • 原文地址:https://www.cnblogs.com/qingyuuu/p/4614534.html
Copyright © 2020-2023  润新知