转: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
近日由于相关业务,需要读取一个将近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时,增加一个分配缓存的参数即可