快速业务通道

通过扩展RandomAccessFile类使之具备Buffer改善I/O性能 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
te(this.buf, 0, this.bufusedsize);       this.bufdirty = false;     }   } // void seek(long pos):移动文件指针到pos位置,并把buf[]映射填充至 POS 所在的文件块。   public void seek(long pos) throws IOException {     if ((pos < this.bufstartpos) || (pos > this.bufendpos)) { // seek pos not in buf       this.flushbuf();       if ((pos >= 0) && (pos <= this.fileendpos) && (this.fileendpos != 0)) {  // seek pos in file (file length > 0)          this.bufstartpos = pos * bufbitlen / bufbitlen;         this.bufusedsize = this.fillbuf();       } else if (((pos == 0) && (this.fileendpos == 0)) || (pos == this.fileendpos + 1)) {  // seek pos is append pos         this.bufstartpos = pos;         this.bufusedsize = 0;       }       this.bufendpos = this.bufstartpos + this.bufsize - 1;     }     this.curpos = pos;   } // int fillbuf():根据bufstartpos,填充buf[]。   private int fillbuf() throws IOException {     super.seek(this.bufstartpos);     this.bufdirty = false;     return super.read(this.buf);   } }

至此缓冲读基本实现,逐字节COPY一个12兆的文件(这里牵涉到读和写,用 BufferedRandomAccessFile试一下读的速度):

耗用时间(秒)
RandomAccessFile RandomAccessFile 95.848
BufferedRandomAccessFile BufferedOutputStream + DataOutputStream 2.813
BufferedInputStream + DataInputStream BufferedOutputStream + DataOutputStream 2.935

可见速度显著提高,与BufferedInputStream+DataInputStream不相上下。

通过扩展RandomAccessFile类使之具备Buffer改善I/O性能(4)

时间:2011-06-19 崔志翔

2.3.实现写缓冲。

写缓冲逻辑的基本原理:

A欲写文件POS位置的一个字节。

B 查BUF中是否有该映射?若有,直接向BUF中写入,并返回true。

C若没有,则BUF重新定位到该POS所在的位置,并把该位置附近的 BUFSIZE字 节的文件内容填充BUFFER,返回B。

下面给出关键部分代码及其说明:

// boolean write(byte bw, long pos):向当前文件POS位置写入字 节BW。 // 根据POS的不同及BUF的位置:存在修改、追加、BUF中、BUF外等情 况。在逻辑判断时,把最可能出现的情况,最先判断,这样可提高速度。 // fileendpos:指示当前文件的尾偏移地址,主要考虑到追加因素   public boolean write(byte bw, long pos) throws IOException {     if ((pos >= this.bufstartpos) && (pos <= this.bufendpos)) { // write pos in buf       this.buf[(int)(pos - this.bufstartpos)] = bw;       this.bufdirty = true;       if (pos == this.fileendpos + 1) { // write pos is append pos         this.fileendpos++;         this.bufusedsize++;       }     } else { // write pos not in buf       this.seek(pos);       if ((pos >= 0) && (pos <= this.fileendpos) && (this.fileendpos != 0)) { // write pos is modi

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号