java实现大文件分割与合并的实例代码_java

复制代码 代码如下:

package com.test; 

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) + "\r\n"); 
      } 
      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() + "\r\n"); 
         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 + "\r\n"); 
       } 
       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; 
         } 
        } 
        // 写入数据源  
        fs.write(object + "\r\n"); 
        // 记录数据的下标  
        tempCount++; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return temp; 
     } 

时间: 2024-10-03 02:16:15

java实现大文件分割与合并的实例代码_java的相关文章

Java发送带html标签内容的邮件实例代码_java

如下所示: package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Transport; public class

Java中获取文件大小的详解及实例代码_java

 Java 获取文件大小 今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法:另外一种是使用FileInputStream的available()方法,当InputStream未进行read操作时,available()的大小应该是等于文件大小的.但是在处理大文件时,后者会发生问题.我们来看一下: 在例子中,我使用了CentOS 6.5 的安装镜像文件,主要是考虑到这个文件足够大(大于2GB). 1.使用File的length()方法 publi

java 反射和动态代理详解及实例代码_java

一.java中的反射 1.通过反射加载类的属性和方法实例代码: /** * java.lang.Class 是反射的源头 * 我们创建了一个类,通过编译(javac.exe)生成对应的class文件,之后我们通过java.exe加载(jvm的类加载器加载)此class文件 * 此class文件加载到内存后,就是一个运行时类,存在缓存区,这个运行时类本事就是一个Class的实例 * 每一个运行时类只加载一次, */ Class<StudentExam> clazz = StudentExam.c

用Java简单实现文件分割与合并

主要应用IO的RandomAccessFile(听说断点续传也是用它实现)  import java.io.*; class Fen{ String fileName; int size;  Fen(String fileName,String size){  this.fileName = fileName;  this.size = Integer.parseInt(size)*1024;  }    public void cut()throws Exception{   int maxx

Java实现对中文字符串的排序功能实例代码_java

废话不多说了,直接给大家代码分享代码了. 具体代码如下所示: package test; /** * * @Title 书的信息类 * @author LR * @version . * @since -- */ public class Book { private String book_id; private String book_name; private String publishing_house; public Book(String book_id, String book_

Java 线程的生命周期详细介绍及实例代码_java

当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过"新建(New)"."就绪(Runnable)"."运行(Running')"."阻塞(Blocked)"和"死亡(Dead)"五种状态.线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行.阻塞之间切换.  一.线程的状态 线程的存在有几种不同的状态,如下: New

java Swing实现选项卡功能(JTabbedPane)实例代码_java

 Swing实现选项卡功能(JTabbedPane) 先创建JTabbedPane对象,构造函数可使用JTabbedPane(int tabPlacement).tabPlacement是JTabbedPane从接口 javax.swing.SwingConstants 继承的字段.可以是BUTTOM,TOP等.如下代码所示: JFrame jframe = new JFrame("TEST"); <a href="http://lib.csdn.net/base/do

java LRU(Least Recently Used )详解及实例代码_java

java LRU(Least Recently Used )详解 LRU是Least Recently Used 的缩写,翻译过来就是"最近最少使用",LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据

java:快速文件分割及合并

文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF