Java实现按行分割大文件

 更新时间:2020年05月19日 15:47:17   作者:黄晓宇  
这篇文章主要为大家详细介绍了Java实现按行分割大文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

简介

工作的时候,需要将一个大的文本文件按行分割成几个小文件。本来懒得写,想网上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();
  }
 }

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

相关文章

  • java如何生成登录随机验证码

    java如何生成登录随机验证码

    这篇文章主要为大家详细介绍了java如何生成登录随机验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • SpringBoot使用Graylog日志收集的实现示例

    SpringBoot使用Graylog日志收集的实现示例

    Graylog是一个生产级别的日志收集系统,集成Mongo和Elasticsearch进行日志收集,这篇文章主要介绍了SpringBoot使用Graylog日志收集的实现示例,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 详解spring整合shiro权限管理与数据库设计

    详解spring整合shiro权限管理与数据库设计

    这篇文章主要介绍了详解spring整合shiro权限管理与数据库设计,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot2中使用@RequestHeader获取请求头的方法

    SpringBoot2中使用@RequestHeader获取请求头的方法

    springMVC/SpringBoot中提供了@RequestHeader注解用来获取请求头。本文就详细的来介绍一下如何使用,感兴趣的可以了解下
    2021-10-10
  • Java导出Excel动态表头的示例详解

    Java导出Excel动态表头的示例详解

    这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-02-02
  • java对象初始化顺序验证示例

    java对象初始化顺序验证示例

    以下这段小程序对调用对象构造函数时,父类构造函数、成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块
    2014-02-02
  • 基于java中BlockingQueue的使用介绍

    基于java中BlockingQueue的使用介绍

    本篇文章小编为大家介绍,基于java中BlockingQueue的使用介绍。需要的朋友参考下
    2013-04-04
  • Java继承概念详细解读

    Java继承概念详细解读

    这篇文章主要介绍了Java继承概念详细解读,涉及继承的概念,合成的语法等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java嵌套类和内部类详解

    Java嵌套类和内部类详解

    这篇文章主要介绍了Java嵌套类和内部类详解,本文讲解了什么是嵌套类及内部类、静态嵌套类、在外部类中定义内部类、在方法中定义内部类、匿名内部类等内容,需要的朋友可以参考下
    2015-04-04
  • SpringCloud如何根据服务名获取服务运行实例并进行负载均衡

    SpringCloud如何根据服务名获取服务运行实例并进行负载均衡

    文章介绍了SpringCloud中使用Nacos作为注册中心时,服务注册和发现的过程,以及如何通过DiscoveryClient接口和LoadBalancerClient类进行服务的负载均衡,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论