java高性能文件读写的工具类?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java高性能文件读写的工具类?相关的知识,希望对你有一定的参考价值。
在<Thinking in Java>一书中,作者Bruce Eckel提供了一个文件读写的工具类TextFile,他说到:
Java I/O类库的问题之一就是:它需要我们编写相当多的代码去执行这些常用操作....因此...我们可创建一个TextFile类,用一个ArrayList()来持有文件的若干行...
他还说:若要频繁使用这个类,我们可以重写此构造器以提高性能.
请问,jdk1.5中或其它工具包中有没有提供这种工具类?或者谁可以提供一个高性能的方便的工具类?或者谁有没有谁重写过这个类的构造器?
他的意思似乎是他的这句话就是对他这段代码的最好的补充了吧。(实际上他已经重写了这个构造器。)
大侠,不信,请仔细体会一下,便是。
我以为,他写的这个“提高性能”,其实就是用构造函数的方法,“隐式”地调用了一下read方法,这样实然可以看出是更加方便了,至于效率,人工调用,起码就可以省掉了吧。
Java 实现文件随机读写-RandomAccessFile
RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。
如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。
下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似,在这里,就不详细说明了。
方法名 | 作用 |
getFilePointer() | 返回文件记录指针的当前位置 |
seek(long pos) | 将文件记录指针定位到pos的位置 |
功能one,读取任意位置的数据,代码如下
public static void randomRed(String path,int pointe){
try{
RandomAccessFile raf=new RandomAccessFile(path, "r");
raf.seek(pointe);//移动文件指针位置
byte[] buff=new byte[1024];
//用于保存实际读取的字节数
int hasRead=0;
//循环读取
while((hasRead=raf.read(buff))>0){
//打印读取的内容,并将字节转为字符串输入
System.out.println(new String(buff,0,hasRead));
}
}catch(Exception e){
e.printStackTrace();
}
}至此,RandomAccessFile类的几个功能,散仙在代码中已给出实现了,现在回到本文开始前的提的那个需求,用RandomAccessFile类就可以轻而易举的完成了,另外需要注意的是,向指定位置插入数据,是散仙自己改造的功能,RandomAccessFile并不直接支持,需要新建一个缓冲区临时空间,存数据,然后在写,因为一旦数据量上了级别,在任意位置插入数据,是很耗内存的,这个也就是为什么hadoop的HDFS文件系统,只支持append的方式,而没有提供修改的操作。
另外我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能,有兴趣的朋友们可以自己实现下。
比较Scanner和RandomAccessFile的效率,使用Scanner按行读取文件效率高好多好多倍,内存占用高一点点而已;而使用RandomAccessFile按行读取数据效率极低,推荐使用Scanner。
RandomAccessFile类。其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效率。
在改进之前先做一个基本测试:逐字节COPY一个12兆的文件(这里牵涉到读和写)。
读 | 写 | 耗用时间(秒) |
RandomAccessFile | RandomAccessFile | 95.848 |
BufferedInputStream + DataInputStream | BufferedOutputStream + DataOutputStream | 2.935 |
我们可以看到两者差距约32倍,RandomAccessFile也太慢了。由其源码可见,RandomAccessFile每读/写一个字节就需对磁盘进行一次I/O操作。
以上是关于java高性能文件读写的工具类?的主要内容,如果未能解决你的问题,请参考以下文章
properties文件读写工具类PropertiesUtil.java