`

转: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虚拟机OutOfMemoryError:Java heap space堆dump文件

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

    java 线程 dump 分析工具 2.3.3

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

    javacore和dump分析工具

    这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...

    java文件分析器4

    java文件分析器4

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    javacore\heapdump文件分析工具

    websphere javacore与heapdump文件分析工具,jca是javacore分析工具,ha是heapdump分析工具,需要用jdk1.6打开

    Java实现解析dcm医学影像文件并提取文件信息的方法示例

    主要介绍了Java实现解析dcm医学影像文件并提取文件信息的方法,结合实例形式分析了java基于第三方库文件针对dcm医学影像文件的解析操作相关实现技巧,需要的朋友可以参考下

    Java开发详解.zip

    031713_【第17章:Java数据库编程】_使用元数据分析数据库笔记.pdf 031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面...

    javahprof文件分析工具1.0安装英文版

    java hprof(文件类型分析器)是一款功能强大的java问题解析软件。可以帮助大家在编辑过程种遇到问题的话就马上解决哦。有兴趣的话赶紧下载! 软件介绍: 许多配置属性可以控制分析过程,这些属性也可以通过JobConf...

    JAVA语音转文字

    在工程中如果需要用到语音转文字功能,可以使用本代码,修改后调用。测试时可以运行main.java文件,根据控制台提示信息,进行录音,然后自动转化为文字。

    Java 将文本文件写成csv格式文件

    为了实现R语言文本挖掘,所需的csv格式文件,利用Java 将文本文件写成csv格式的文件;文本文件的存放结构为---example ---class1 t1.txt ... ---class2 f1.txt ...

    Java文件结构解析工具

    一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...

    java源码包2

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包4

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java对mht文件解析

    java对mht文件解析,并实现内容的抓取

    利用JAVA对STDF文件进行分析_郑立钧

    利用JAVA对STDF文件进行分析_郑立钧 有部分源码,可以借鉴

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java对音频文件的频谱分析

    此包可以支持java对音频文件的频谱分析,很好的东西,。。。。

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...

    mat java 分析 文件 dump

    mat 工具 使用 方法 讲解 java dump 文件 分析

Global site tag (gtag.js) - Google Analytics