`

转:java分析超大文件

 
阅读更多

Java读取大文件

遇到过这样一个情况,需要用java读取一个200M的文本格式文件,而且还需要对文件的内容做解析,进行分词。如果用JVM的默认设置,利用Scanner类只能读出4M大小内容,于是我就在网上搜索,但是网上没有找到一篇文章是我所需要的内容。于是我只好翻thinking in java,发现了一个java的nio里有个MappedByteBuffer类,他的作用可以把一个文件映射到内存中,然后就能像访问数组一样去读取这个文件。于是我在JDK中查了MappedByteBuffer的详细的用法,然后将其和Scanner类结合一下,便能得到一边读取大文件,一边解析读取的内容了功能了,具体的代码如下:

public void readResource() {
   long fileLength = 0;
   final int BUFFER_SIZE = 0x300000;// 3M的缓冲
  
   for(String fileDirectory:this.readResourceDirectory())//得到文件存放路径,我这里使用了一个方法从XML文件中读出文件的
               //存放路径,当然也可以用绝对路径来代替这里的fileDriectory
   {
   File file = new File(fileDirectory);
   fileLength = file.length();
   try {
     MappedByteBuffer inputBuffer =
     new RandomAccessFile(file,"r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, fileLength);//读取大文件
    
     byte[] dst = new byte[BUFFER_SIZE];//每次读出3M的内容
    
     for(int offset=0; offset < fileLength; offset+= BUFFER_SIZE)
     {
       if(fileLength - offset >= BUFFER_SIZE)
       {
           for(int i = 0;i < BUFFER_SIZE;i++)
           dst

= inputBuffer.get(offset + i);
       }
       else
       {
         for(int i = 0;i < fileLength - offset;i++)
               dst = inputBuffer.get(offset + i);
         }
       //将得到的3M内容给Scanner,这里的XXX是指Scanner解析的分隔符
       Scanner scan = new Scanner(new ByteArrayInputStream(dst)).useDelimiter("XXX");
       while(scan.hasNext())
       {
           //这里为对读取文本解析的方法
       }        
       scan.close();
     }
   } catch (Exception e)
   {
     e.printStackTrace();
   }
   }
}
希望以上这段代码能对当时和我遇到同样问题的人能有所帮助。

近日由于相关业务,需要读取一个将近1G的文件,然后将符合条件的数据insert进数据库。而执行完程序之后,最后写入数据库的数据是将近100w条,在linux系统下运行时间将近3个小时,操作量还是上了一个相当的规模。

由于之前没有进行过超大文件的读写,一开始以为需要使用分布式系统等复杂的操作才能进行。后来google了一下,发现jdk本身就支持超大文件的读写,真是虚惊一场。
网上的文章基本分为两大类,一类是使用BufferedReader类读写超大文件;另一类是使用RandomAccessFile类读取,经过比较,最后使用了前一种方式进行超大文件的读取,下面是相关代码,其实很简单


File file = new File(filepath);    
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));     
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);// 用5M的缓冲读取文本文件   
         
String line = ""; 
while((line = reader.readLine()) != null){ 
//TODO: write your business 

注意代码,在实例化BufferedReader时,增加一个分配缓存的参数即可


摘自  千山独行
分享到:
评论

相关推荐

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    - 分析堆转储文件(heap dump),找出占用内存较大的对象集合。 **注意事项:** - 调整JVM参数时需谨慎,过大的堆可能会导致其他问题,如GC停顿时间增加。 - 应用程序设计时应考虑到资源的有效利用,避免无谓的内存...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    在 Linux 下,可以在 `catalina.sh` 文件中添加 `export JAVA_OPTS="-server -Xms512m -Xmx1024m"`,以设置 JVM 的堆大小。 优化程序 1. 避免死循环:检查程序中是否存在死循环,并进行优化。 2. 手动回收垃圾:...

    java虚拟机OutOfMemoryError:Java heap space堆dump文件

    java虚拟机OutOfMemoryError:Java heap space堆dump文件,可以直接用来分析。

    Java反编译工具把.class文件转换为.java文件

    - 解压后会得到两个文件:一个是可执行文件(名为`jad.exe`,适用于Windows系统;或名为`jad`,适用于*nix系统),另一个是此README文件。无需进行额外设置即可使用。 2. **基本使用**: - 使用命令行界面调用Jad...

    java 将文件中二进制文件转换成文本文本文件并输出

    在Java编程语言中,将二进制文件转换为文本文档通常涉及到字符编码的理解和处理。二进制文件可以包含任何类型的数据,如图像、音频、...通过分析和运行这些文件,你可以更好地理解如何在Java中实现二进制到文本的转换。

    javacore\heapdump文件分析工具

    `jca`(Java Core Analyzer)是专门用于分析`javacore`文件的工具,它可以提供更直观和详细的分析报告,帮助开发者定位问题原因。 而`heapdump`文件则是JVM在运行过程中,通过Java的`jmap`命令或者`VisualVM`等工具...

    一个java文件扫描程序

    1. Limited functionality:Java 文件扫描程序只能统计文件中的行数、注释行数和空白行数,无法进行更加复杂的代码分析。 2. Limited scalability:Java 文件扫描程序可能无法处理非常大的项目,需要优化和改进以...

    xml文件自动转成java对象工具

    XSD文件转Java工具能够基于XSD文件生成对应的Java类,这些类包含了与XSD定义的元素和属性相对应的字段和方法。 转换过程通常包括以下步骤: 1. **解析XSD文件**:工具首先读取XSD文件,分析其元素、属性、类型定义...

    java读取excel文件

    2. 灵活:Java 读取 Excel 文件可以对数据进行灵活的处理和分析。 3. 可靠:Java 读取 Excel 文件可以确保数据的安全和可靠。 Java 读取 Excel 文件的困难点 1. Excel 文件格式:Excel 文件格式的变化可能会导致...

    java解析DWG文件为json使用superMap

    1. 加载DWG文件:使用SuperMap iObjects Java提供的类加载DWG文件。 2. 解析DWG数据:解析文件,提取所需的地理信息。 3. 将数据转换为JSON:将解析到的数据结构化为JSON对象。 4. 输出JSON:将JSON对象写入文件或...

    java读取excel之xlsl超大文件

    在Java编程中,处理Excel文件是一项常见的任务,特别是在数据分析、报表生成或数据导入导出等场景下。然而,当处理的Excel文件特别是XLSL格式的文件数据量巨大时,传统的API,如Apache POI或者JExcelAPI,可能会遇到...

    smali2java——直接将smali转换成java

    **标题与描述解析** 标题"smali2java——直接将smali转换成java"揭示了本文的核心主题,即一个名为"smali2...尽管在压缩包中的"Smali2Java"可能是工具的可执行文件,实际使用时还需要结合相关文档或说明来正确操作。

    Java处理100万行超大Excel文件秒级响应

    ### Java处理100万行超大Excel文件秒级响应 #### 一、问题背景与需求分析 在项目开发过程中,经常会遇到需要处理大量Excel数据的情况。这些数据可能包括成千上万条记录,每条记录又包含多个字段。传统的处理方式...

    java对音频文件的频谱分析

    在Java编程环境中,进行音频文件的频谱分析是一项复杂但重要的任务,特别是在音频处理和音乐信息检索领域。本文将深入探讨如何使用给定的压缩包文件来实现这一目标。 首先,频谱分析是将时域信号转换为频域表示的...

    java课程设计敏感词汇分析

    Java课程设计中的“敏感词汇分析程序”是一个旨在培养学生掌握Java编程技术、图形用户界面(GUI)设计、文件处理和异常处理的应用项目。以下是该设计的主要知识点: 1. **图形用户界面**: - Java中的GUI库通常使用...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java文件分析器1

    【Java文件分析器1】是针对Java编程语言的文件解析工具,主要目的是处理和分析Java源代码文件,以获取相关信息,如类结构、方法、变量等。在软件开发过程中,这样的工具能帮助开发者理解代码逻辑,进行代码审查,...

    JAVA语音转文字

    Java语言在语音识别领域提供了丰富的库和工具,使得开发者能够轻松地实现语音转文字功能。在你的项目中,你可以利用这些资源来构建一个高效的语音识别系统。以下是对"JAVA语音转文字"这一主题的详细解释。 1. **...

    Java实现将word转换为html的方法示例【doc与docx格式】

    Java语言中实现将word文档转换为html格式的方法示例,结合实例形式分析了java针对doc与docx格式文件的相关转换操作技巧。 知识点1:Java中word文档的读取 在Java中,读取word文档可以使用Apache POI库,POI库提供...

Global site tag (gtag.js) - Google Analytics