Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 326|回复: 0

[JavaIO学习]大数据文件的写入,读取,分割,排序,合并

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-5 23:58:49 | 显示全部楼层 |阅读模式
    1. import java.io.BufferedReader;
    2. import java.io.BufferedWriter;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileReader;
    5. import java.io.FileWriter;
    6. import java.io.IOException;
    7. import java.util.Collections;
    8. import java.util.Iterator;
    9. import java.util.LinkedList;
    10. import java.util.Random;
    11. public class ConcludeCombinationSortWrite {
    12. /**
    13.   * 大数据排序合并
    14.   *
    15.   * @param args
    16.   */
    17. public static void main(String[] args) throws IOException {
    18.   // 写入文件的路径
    19.   String filePath = "D:\456";
    20.   // 切分文件的路径
    21.   String sqlitFilePath = "D:\456\123";
    22.   //数据的个数
    23.   int CountNumbers=1000000;
    24.   
    25.   //子文件的个数
    26.   int CountFile=10;
    27.   
    28.   //精度
    29.   int countAccuracy=30*CountFile;
    30.   
    31.   long startNumber=System.currentTimeMillis();
    32.   // 写入大数据文件
    33.   WriteData(filePath,CountNumbers);
    34.   System.out.println("存储完毕");
    35.   
    36.   // 将大数据文件切分到另外的十个小文件中
    37.   sqlitFileDate(filePath, sqlitFilePath,CountFile);
    38.   System.out.println("文件切割完毕!");
    39.   // 把每个文件的数据进行排序
    40.   singleFileDataSort(sqlitFilePath,CountFile);
    41.   System.out.println("每个子文件排序完毕!");
    42.   
    43.   //精度调整,十个文件数据进行比较整合
    44.   deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
    45.   System.out.println("整合完毕");
    46.   long stopNumber=System.currentTimeMillis();
    47.   System.out.println("耗时"+(stopNumber-startNumber)/1000+"毫秒");
    48. }
    49. // 写入大数据文件
    50. public static void WriteData(String path,int CountNumbers) throws IOException {
    51.   path = path + "//12114.txt";
    52.   FileWriter fs = new FileWriter(path);
    53.   BufferedWriter fw=new BufferedWriter(fs);
    54.   for (int i = 0; i < CountNumbers; i++) {
    55.    fw.write(new Random().nextInt(Integer.MAX_VALUE) + "
    56. ");
    57.   }
    58.   fw.close();
    59.   fs.close();
    60.   
    61. }
    62. // 将大数据文件切分到另外的十个小文件中
    63. public static void sqlitFileDate(String filepath, String sqlitPath,
    64.    int CountFile) throws IOException {
    65.   FileWriter fs = null;
    66.   BufferedWriter fw=null;
    67.   FileReader fr = new FileReader(filepath + "//12114.txt");
    68.   BufferedReader br = new BufferedReader(fr); // 读取获取整行数据
    69.   
    70.   int i = 1;
    71.   LinkedList WriterLists=new LinkedList();    //初始化文件流对象集合
    72.   LinkedList fwLists=new LinkedList();
    73.   for (int j = 1; j <= CountFile; j++) {
    74.    
    75.     //声明对象
    76.     fs = new FileWriter(sqlitPath + "//12//" + j + ".txt",false);
    77.     fw=new BufferedWriter(fs);
    78.    
    79.    
    80.     //将对象装入集合
    81.     WriterLists.add(fs);
    82.     fwLists.add(fw);
    83.   }
    84.   //判断是文件流中是否还有数据返回
    85.   while (br.ready()) {
    86.    
    87.    int count=1;//初始化第一文件流
    88.    for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
    89.     BufferedWriter type = (BufferedWriter) iterator.next();
    90.     if(i==count)//判断轮到第几个文件流写入数据了
    91.     {
    92.      //写入数据,跳出,进行下一个文件流,下一个数据的写入
    93.      type.write(br.readLine() + "
    94. ");
    95.      break;
    96.     }
    97.     count++;
    98.    }
    99.    //判断是否到了最后一个文件流了
    100.    if (i >= CountFile) {
    101.     i = 1;
    102.    } else
    103.     i++;
    104.   }
    105.   br.close();
    106.   fr.close();
    107.   for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
    108.    BufferedWriter object = (BufferedWriter) iterator.next();
    109.    object.close();
    110.   }
    111.   //遍历关闭所有子文件流
    112.   for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
    113.    FileWriter object = (FileWriter) iterator.next();
    114.    object.close();
    115.   }
    116. }
    117. // 把每个文件的数据进行排序
    118. public static void singleFileDataSort(String path1,int CountFile) throws IOException {
    119.   LinkedList nums = null;
    120.   for (int i = 1; i <= CountFile; i++) {
    121.    nums = new LinkedList();
    122.    String path = path1 + "//12//" + i + ".txt";
    123.    try {
    124.     FileReader fr = new FileReader(path);
    125.     BufferedReader br = new BufferedReader(fr);
    126.     while (br.ready()) {
    127.      // 将读取的单个数据加入到集合里面
    128.      nums.add(Integer.parseInt(br.readLine()));
    129.     }
    130.     // 对集合进行排序
    131.     Collections.sort(nums);
    132.     // 将排序好的数据写入源文件
    133.     numberSort(nums, path);
    134.     br.close();
    135.     fr.close();
    136.    } catch (NumberFormatException e) {
    137.     e.printStackTrace();
    138.    } catch (FileNotFoundException e) {
    139.     e.printStackTrace();
    140.    } catch (IOException e) {
    141.     e.printStackTrace();
    142.    }
    143.   }
    144. }
    145. // 对每个文件数据进行排序,再写入源文件
    146. public static void numberSort(LinkedList list, String path) {
    147.   try {
    148.    FileWriter fs = new FileWriter(path);
    149.    BufferedWriter fw=new BufferedWriter(fs);
    150.    for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    151.     Object object = (Object) iterator.next();
    152.     fw.write(object + "
    153. ");
    154.    }
    155.    fw.close();
    156.    fs.close();
    157.   } catch (IOException e) {
    158.    e.printStackTrace();
    159.   }
    160. }
    161. // 文件数据最终整合(精度调整)
    162. public static void deathDataFile(String filepath, String sqlitFilePath1,
    163.    int countAccuracy, int CountFile) throws IOException {
    164.   LinkedList nums = new LinkedList();                                       //添加数据,进行排序
    165.   Object temp = null;                                                       // 记录每次排序剩下的最后一个数字
    166.   boolean ispass = false;
    167.   LinkedList ispasses = null;                                               //记录数据文件的状态信息
    168.   FileWriter fs = new FileWriter(filepath + "//Sort.txt//", false);           //创建文件流,以便整合的数据写入
    169.   BufferedWriter bw=new BufferedWriter(fs);
    170.   FileReader fr = null;                                                     //声明读取文件流
    171.   BufferedReader br = null;                                                 //声明BufferedReader
    172.   LinkedList WriterLists = new LinkedList(); // 初始化文件流对象集合
    173.   LinkedList WriterListFile = new LinkedList();
    174.   for (int j = 1; j <= CountFile; j++) {
    175.    // 声明对象,开启所有子文件流访问所有子文件的数据
    176.    fr = new FileReader(sqlitFilePath1 + "//12/" + j + ".txt");
    177.    
    178.    //开启所有BufferedReader,方便下次的整行的读取
    179.    br = new BufferedReader(fr);
    180.    
    181.    // 将所有 FileReader对象装入集合
    182.    WriterListFile.add(fr);
    183.    
    184.    // 将所有 BufferedReader对象装入集合
    185.    WriterLists.add(br);
    186.   }
    187.   for (;;) {
    188.    // 将十个源文件的是否有数据情况存入集合,以方便后面做判断
    189.    ispasses = new LinkedList();
    190.    
    191.    // 分别读取十个源文件的单个数据
    192.    for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
    193.     BufferedReader object = (BufferedReader) iterator.next();
    194.     Object obj = null;
    195.     while (object.ready()) {
    196.      //添加所有文件流的每次的数据
    197.      nums.add(Integer.parseInt(object.readLine().toString()));
    198.      break;
    199.     }
    200.     if (object.ready() == false)
    201.      ispasses.add("true");           //将各文件中的数据状态存入集合中
    202.    }
    203.    
    204.    // 决断是否是第一次进来
    205.    if (nums.size() % countAccuracy == 0 && ispass == false) {
    206.     // 对集合进行排序
    207.     Collections.sort(nums);
    208.     // 接收最大的数据,其它的数据写入总排序文件
    209.     temp = numberSortData(nums, filepath, false, countAccuracy, bw);
    210.    
    211.     //重新初始化集合
    212.     nums = new LinkedList();
    213.     // 添加上一组比较剩下的数据
    214.     nums.add(temp);
    215.     ispass = true;
    216.     // 记录源文件的数据数量,以便下次的遍历
    217.     continue;
    218.    }
    219.    if (ispass) {
    220.     if (nums.size() % countAccuracy == 1 && nums.size() > 1) {
    221.      // 对集合进行排序
    222.      Collections.sort(nums);
    223.      // 接收最大的数据,其它的数据写入总排序文件
    224.      temp = numberSortData(nums, filepath, true, countAccuracy,
    225.        bw);
    226.      nums = new LinkedList();
    227.      nums.add(temp);
    228.      continue;
    229.     }
    230.    }
    231.    // 记录下一组数据的位置
    232.    // 判断是不是十个文件都没有数据
    233.    if (ispasses.size() == CountFile) {
    234.     Collections.sort(nums);
    235.     temp = numberSortData(nums, filepath, true, countAccuracy, bw);
    236.     nums = new LinkedList();
    237.     break;
    238.    }
    239.   }
    240.   bw.close();
    241.   //关闭写入流
    242.   fs.close();
    243.   
    244.   //关闭所有的BufferedReader
    245.   for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
    246.    BufferedReader object2 = (BufferedReader) iterator.next();
    247.    object2.close();
    248.   }
    249.   
    250.   //关闭所有的FileReader
    251.   for (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {
    252.    FileReader object = (FileReader) iterator.next();
    253.    object.close();
    254.   }
    255. }
    256. // 对数据进行排序,写入最终文件中(精度调整)
    257. public static Object numberSortData(LinkedList list, String filePath,
    258.    boolean ispass, int countAccuracy,BufferedWriter fs) {
    259.   Object temp = 0;                                                        //记录最后一个值
    260.   int tempCount = 0;                                                      //记录写入的数据位置
    261.   try {
    262.    for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    263.     Object object = (Object) iterator.next();
    264.     // 判断是否是最后一个数
    265.     if (tempCount == list.size() - 1) {
    266.      // 判断集合里面不足一百&#65533;&#65533;了
    267.      if (list.size() < countAccuracy + 1 && ispass) {
    268.       temp = null;
    269.      } else {
    270.       temp = object;
    271.       break;
    272.      }
    273.     }
    274.     // 写入数据源
    275.     fs.write(object + "
    276. ");
    277.     // 记录数据的下标
    278.     tempCount++;
    279.    }
    280.   } catch (IOException e) {
    281.    e.printStackTrace();
    282.   }
    283.   return temp;
    284. }
    285. }
    286. C:at>java     ConcludeCombinationSortWrite
    287. 存储完毕
    288. 文件切割完毕!
    289. 每个子文件排序完毕!
    290. 整合完毕
    291. 耗时19毫秒
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/5/235848890.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 11:45 , Processed in 0.332015 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表