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; 
     } 
}

(0)

相关推荐

  • java 在图片上写字,两个图片合并的实现方法

    实例如下: package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; public class pic

  • Java实现多个文档合并输出到一个文档

    本文实例为大家分享了Java实现多个文档合并输出到一个文档的具体代码,供大家参考,具体内容如下 方法:Java NIO package First; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; publi

  • java 实现切割文件和合并文件的功能

    java 实现切割文件和合并文件的功能 一.切割文件代码如下: 需求:将一个媒体文件切割成多个碎片(每个碎片的大小为1M),并添加配置说明文件 1.创建(指定)一个文件夹,用于保存切割出来的碎片           2.创建源文件对象,并传入一个输入流对象           3.创建一个缓冲区为1M           4.创建一个输入流对象并将源文件对象传入,创建一个输出流对象引用           5.每个缓冲区获取到碎片时,使用输出对应流对象写入到一个新的文件           6.

  • java 流操作对文件的分割和合并的实例详解

    java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代码: package com.dufy.file; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.ut

  • java实现合并2个文件中的内容到新文件中

    编写一个程序 将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中 a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔. 复制代码 代码如下: package javase.arithmetic; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.

  • java文件操作工具类实现复制文件和文件合并

    两个方法:1.复制一个目录下面的所有文件和文件夹2.将一个文件目录下面的所有文本文件合并到同一个文件中 复制代码 代码如下: package com.firewolf.test; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; public class FileReaderUtil { public static void

  • Java实现文件分割和文件合并实例

    文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来). 找了好多博客,本来想转载一个来的 结果找不到了.很无奈. 只好自己贴代码上了. 当然我会尽力好好写注释的. 文件切割器: import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Scanner; public c

  • 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;  im

  • webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码

    注意: 1,webuploader上传组件会和jQuery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性; enctype="multipart/form-data" 2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置! <!-- 上传拦截,如最大上传值及最小上传值 --> <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制 <bean id="multipartRes

  • python实现大文件分割与合并

    很多时候我们会面临大文件无法加载到内存,或者要传输大文件的问题.这时候就需要考虑将大文件分割为小文件进行处理了. 下面是一种用python分割与合并分件的实现. import os FILE_DIR = os.path.dirname(os.path.abspath(__file__)) #======================================================== # 文件操作 #=======================================

  • Android 大文件切割与合并的实现代码

    前言: 由于公司的业务,硬生生的把ios开发的我,掰成了android!关于上传文件的需求处理,做了一个Java的简单封装 DocumentManagement .其中集成了,检测文件,MD5加密,Base64加密/解码,针对文件Base64加密处理,获取文件后戳,切割文件,合并文件等方法. 亲测可切割与合并有效:视频.mp3.jpg.apk!还有很多没测,讲道理应该是都可以的.合并效果如图: 好了不扯皮了,直接上代码!注:以下代码仅供参考,如有想法请留言告知 DocumentManagemen

  • PHP大文件分割分片上传实现代码

    服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_max_filesize = 2M //PHP最大能接受的文件大小 post_max_size = 8M //PHP能收到的最大POST值' memory_limit = 128M //内存上限 max_execution_time = 30 //最大执行时间 当然不能简单粗暴的把上面几个值调大,否则服务器内存资源吃光是迟早的问题. 解决思路 好在HTML5开放了新的FILE API,也可以直接操作二进制对象,我们可

  • Java实现文件分割与合并

    本文实例为大家分享了Java实现文件分割与合并的具体代码,供大家参考,具体内容如下 文件的操作 文件的分割 package com.xhh.util; import java.io.*; /** * 文件分割的方法 * @param SrcFilePath 指定分割的文件路径 * @param SingleGoalFileSize 分割文件的个数 * @param GoalFileDirectory 分割之后的路径 */ public class Split{ public static voi

  • Java实现大文件的分割与合并的方法详解

    目录 一.题目描述-合并多个文本文件 1.题目 2.解题思路 3.代码详解 二.题目描述-对大文件进行分割处理 1.题目 2.解题思路 3.代码详解 三.题目描述-分割后又再次合并 1.题目 2.解题思路 3.代码详解 4.多学一个知识点 一.题目描述-合并多个文本文件 1.题目 题目:做一个合并多个文本文件的工具. 2.解题思路 创建一个类:TextFileConcatenation 使用TextFileConcatenation继承JFrame构建窗体 读取文本文件时,用的是Buffered

  • Linux中split大文件分割和cat合并文件详解

    前言 当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1. 分割文件 文件分割可以使用split命令,该即支持文本文件分割,又支持二进制文件分割:而合并文件可以使用cat命令. 1.1 文本文件分割 分割文本文件时,可以按文件大小分割,也可以按文本行数分割. 按文件大小分割 按文件大小分割文件时,需要以-C参数指定分割后的文件大小: $ split -C

  • Java实现大文件的切割与合并操作示例

    本文实例讲述了Java实现大文件的切割与合并操作.分享给大家供大家参考,具体如下: 这里实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 在这里我只是给大家写下我自己的一点简单的代码: package io2; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io

随机推荐