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入门到精通教程
查看: 759|回复: 0

大数据文件的写入,读取,分割,排序,合并 java实例

[复制链接]

该用户从未签到

发表于 2011-9-19 13:46:08 | 显示全部楼层 |阅读模式
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 ConcludeCombinationSortWrite {
/**
  * 大数据排序合并
  *
  * @param args
  */
public static void main(String[] args) throws IOException {
  // 写入文件的路径
  String filePath = "D:\\456";
  // 切分文件的路径
  String sqlitFilePath = "D:\\456\\123";
  //数据的个数
  int CountNumbers=1000000;
  
  //子文件的个数
  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;
}
}
C:\bat>java     ConcludeCombinationSortWrite
存储完毕
文件切割完毕!
每个子文件排序完毕!
整合完毕
耗时19毫秒
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 16:38 , Processed in 0.387625 second(s), 49 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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