首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

转:java分析硕大无比文件

2012-09-10 
转:java分析超大文件Java读取大文件 遇到过这样一个情况,需要用java读取一个200M的文本格式文件,而且还需

转: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时,增加一个分配缓存的参数即可


摘自? 千山独行

热点排行