花1K内存实现高效IO的RandomAccessFile类_第1页
花1K内存实现高效IO的RandomAccessFile类_第2页
花1K内存实现高效IO的RandomAccessFile类_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、主体: 目前最流行的J2SDK版本是系列。使用该版本的开发人员需文件随机存取, 就得 使用RandomAccessFile类。其I/O性能较之其它常用开发语言的同类性能差距 甚远,严重影响程序的运行效率。开发人员迫切需要提高效率,下面分析 RandomAccessFile等文件类的源代码, 找出其中的症结所在,并加以改良优化,创立一个 性/价比俱佳的随机文件访 问类 BufferedRandomAccessFile。1.在改良之前先做一个根本测试:逐字节COPY一个12兆的文件这里牵涉到读和写。读写耗用时 间秒Ran domAccessFileRan domAccessFileBuffered

2、I nputStream + DataI nputStreamBufferedOutputStream+ DataOutputStream我们可以看到两者差距约32倍,RandomAccessFile也太慢了。先看看两者关键 局部的源代码,比照分析,找出原因。1. 1. RandomAccessFilepublic class Ran domAccessFile impleme nts DataOutput, Data In put public final byte readByte() throws IOException int ch =();if (ch 0)throw new EOF

3、Exception(); return (byte)(ch);public n ative int read() throws IOExcepti on;public final void writeByte(int v) throws IOException write(v);public native void write(int b) throws IOException;可见,RandomAccessFile每读/写一个字节就需对磁盘进行一次 I/O操作1. 2. BufferedlnputStreampublic class Bufferedl nputStream exte nds

4、 Filterl nputStream private static int defaultBufferSize = 2048; protected byte buf;=pos * bufbitle n / bufbitle n;seek函数使用在各函数中,调用非常频繁,上面加重的这行语句根据pos和bufsize好方法。确定buf对应当前文件的映射位置,用*、/确定,显然不是一个优化一:=(pos bufbitle n;优化二:=pos & bufmask; / =(lo ng) - 1);两者效率都比原来好,但后者显然更好,因为前者需要两次移位运算、后者只需 一次逻辑与运算bufmask可

5、以预先得出。至此优化根本实现,逐字节 COPY一个12兆的文件,这里牵涉到读和写,结合缓冲读,用优化后 BufferedRandomAccessFile试一下读/写的速度:读写耗用时 间秒Ran domAccessFileRan domAccessFileBufferedI nputStream +Data In putStreamBufferedOutputStream + DataOutputStreamBufferedRa ndomAccessFileBufferedOutputStream + DataOutputStreamBufferedRa ndomAccessFileBuffe

6、redRa ndomAccessFileBufferedRa ndomAccessFile 优BufferedRa ndomAccessFile 优可见优化尽管不明显,还是比未优化前快了一些,也许这种效果在老式机上会更 明显。以上比拟的是顺序存取,即使是随机存取,在绝大多数情况下也不止一个BYTE所以缓冲机制依然有效。而一般的顺序存取类要实现随机存取就不怎么容易了。4 需要完善的地方提供文件追加功能:public boolea n appe nd(byte bw) throws IOExcepti on return (bw, + 1);提供文件当前位置修改功能:public boolean

7、write(byte bw) throws IOException return (bw,;返回文件长度(由于BUF读写的原因,与原来的RandomAccessFile类有所不同):public long len gth() throws IOExcepti on return + 1,;返回文件当前指针由于是通过 BUF读写的原因,与原来的 Ran domAccessFile类有所不同:public long getFilePointer() throws lOException return ;提供对当前位置的多个字节的缓冲写功能:public void write(byte b, int

8、 off, int len) throws IOException long writee ndpos = + len - 1;if (writeendpos =writee ndpos;(writee ndpos+1);public void write(byte b) throws IOException (b, 0,;提供对当前位置的多个字节的缓冲读功能:public int read(byte b, int off, int len) throws IOExcepti on long reade ndpos = + len - 1;if (reade ndpos = & reade n

9、dpos bufif (readendpos / read b part in file len = (in t)() - + 1);Jlen = (b, off, le n);reade ndpos = + len - 1;(reade ndpos + 1);return len;public int read(byte b) throws IOExcepti on return (b, 0,;public void setLe ngth(l ong n ewLe ngth) throws IOExcepti on if (n ewLe ngth 0) =n ewLe ngth - 1; e

10、lse =0;(n ewLe ngth);public void close() throws IOException ();();至此完善工作根本完成,试一下新增的多字节读/写功能,通过同时读/写1024个字节,来COPY一个12兆的文件,这里牵涉到读和写,用完善后BufferedRandomAccessFile 试一下读 / 写的速度:读写耗用时 间秒Ran domAccessFileRan domAccessFileBuffered In putStream +BufferedOutputStream +Data In putStreamDataOutputStreamBufferedR

11、a ndomAccessFileBufferedOutputStream + DataOutputStreamBufferedRa ndomAccessFileBufferedRa ndomAccessFileBufferedRa ndomAccessFile 优BufferedRa ndomAccessFile 优BufferedRa ndomAccessFile宀完BufferedRa ndomAccessFile宀完5.与新类 MappedByteBuffer+RandomAccessFile 的比照?提供了 NIO类,其中MappedByteBuffer类用于映射缓冲,也可以映射随机文

12、件 访问,可见JAVA设计者也看到了 RandomAccessFile的问题,并加以改良。怎么 通过MappedByteBuffe叶RandomAccessFile拷贝文件呢?下面就是测试程序的 主要局部:RandomAccessFile rafi = new RandomAccessFile(SrcFile, r);Ran domAccessFile rafo = new Ran domAccessFile(DesFile, rw); FileCha nnel fci =();FileCha nnel fco =();long size =();MappedByteBuffer mbbi =

13、 0, size);MappedByteBuffer mbbo = 0, size);long start =();for (int i = 0; i size; i+) byte b = (i);(i, b);();();();();Spe nd: +(double)()-start) /1000 + s);试一下的映射缓冲读/写功能,逐字节COPY一个12兆的文件,这里牵涉到读 和写:读写耗用时 间秒Ran domAccessFileRan domAccessFileBufferedI nputStream + Data In putStreamBufferedOutputStream +

14、 DataOutputStreamBufferedRa ndomAccessFileBufferedOutputStream + DataOutputStreamBufferedRa ndomAccessFileBufferedRa ndomAccessFileBufferedRa ndomAccessFile 优BufferedRa ndomAccessFile 优BufferedRa ndomAccessFile宀完BufferedRa ndomAccessFile宀完MappedByteBuffe 叶 Ran domAccessFileMappedByteBuffe 叶 Ran domAccessFile确实不错,看来比有了极大的进步。如果以后采用版本开发软件时,需要对文件 进行随机访问,建议采用MappedByteBuffe叶RandomAccessFile的方式。但鉴于 目前采用及以前的版本开发的程序占绝大多数的实际情况,如果您开发的J

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论