Java实现按行分割大文件

所属分类: 软件编程 / java 阅读数: 77
收藏 0 赞 0 分享

简介

工作的时候,需要将一个大的文本文件按行分割成几个小文件。本来懒得写,想网上copy一下得了,但是 google 了一遍,找了几个代码写的有点乱,尝试了之后发现效率太慢了,一个 1000000 行 200M 的文件,按每个文件 2000 行分割,要6分多钟才能跑完。没办法自己写了个,试了几次,基本都是 4 秒内跑完,贴出来记录下,下次用就直接 copy 出来用。

代码

public static List<File> splitDataToSaveFile(int rows, File sourceFile, String targetDirectoryPath) {
  long startTime = System.currentTimeMillis();
  List<File> fileList = new ArrayList<>();
  log.info("开始分割文件");
  File targetFile = new File(targetDirectoryPath);
  if (!sourceFile.exists() || rows <= 0 || sourceFile.isDirectory()) {
   return null;
  }
  if (targetFile.exists()) {
   if (!targetFile.isDirectory()) {
    return null;
   }
  } else {
   targetFile.mkdirs();
  }
 
  try (FileInputStream fileInputStream = new FileInputStream(sourceFile);
    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
   StringBuilder stringBuilder = new StringBuilder();
   String lineStr;
   int lineNo = 1, fileNum = 1;
   while ((lineStr = bufferedReader.readLine()) != null) {
    stringBuilder.append(lineStr).append("\r\n");
    if (lineNo % rows == 0) {
     File file = new File(targetDirectoryPath + File.separator + fileNum + sourceFile.getName());
     writeFile(stringBuilder.toString(), file);
     //清空文本
     stringBuilder.delete(0, stringBuilder.length());
     fileNum++;
     fileList.add(file);
    }
    lineNo++;
   }
   if ((lineNo - 1) % rows != 0) {
    File file = new File(targetDirectoryPath + File.separator + fileNum + sourceFile.getName());
    writeFile(stringBuilder.toString(), file);
    fileList.add(file);
   }
   long endTime = System.currentTimeMillis();
   log.info("分割文件结束,耗时:{}秒", (endTime - startTime) / 1000);
  } catch (Exception e) {
   log.error("分割文件异常", e);
  }
  return fileList;
 }
 
 private static void writeFile(String text, File file) {
  try (
    FileOutputStream fileOutputStream = new FileOutputStream(file);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
    BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter, 1024)
  ) {
   bufferedWriter.write(text);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

JavaWeb项目部署到服务器详细步骤详解

这篇文章主要介绍了JavaWeb项目如何部署到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

IDEA基于支付宝小程序搭建springboot项目的详细步骤

这篇文章主要介绍了IDEA基于支付宝小程序搭建springboot项目的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解SpringBoot应用服务启动与安全终止

这篇文章主要介绍了SpringBoot应用服务启动与安全终止,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring Boot启动及退出加载项的方法

这篇文章主要介绍了Spring Boot启动及退出加载项的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring Data Jpa 自动生成表结构的方法示例

这篇文章主要介绍了Spring Data Jpa 自动生成表结构的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

IDEA中osgi的开发应用指南详解

这篇文章主要介绍了IDEA中osgi的开发应用指南详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解用maven将dubbo工程打成jar包运行

这篇文章主要介绍了详解用maven将dubbo工程打成jar包运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解Java合并数组的两种实现方式

这篇文章主要介绍了Java合并数组的两种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

使用Jenkins Pipeline自动化构建发布Java项目的方法

这篇文章主要介绍了使用Jenkins Pipeline自动化构建发布Java项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

使用Maven配置Spring的方法步骤

这篇文章主要介绍了使用Maven配置Spring的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多