快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
效果在老式机上 会更明显。

以上比较的是顺序存取,即使是随机存取,在绝大多数情况下也不止一个 BYTE,所以缓冲机制依然有效。而一般的顺序存取类要实现随机存取就不怎么容 易了。

需要完善的地方

提供文件追加功能:

public boolean append(byte bw) throws IOException {     return this.write(bw, this.fileendpos + 1);   }

提供文件当前位置修改功能:

public boolean write(byte bw) throws IOException {     return this.write(bw, this.curpos);   }

返回文件长度(由于BUF读写的原因,与原来的RandomAccessFile类有所不同 ):

public long length() throws IOException {     return this.max(this.fileendpos + 1, this.initfilelen);   }

返回文件当前指针(由于是通过BUF读写的原因,与原来的RandomAccessFile 类有所不同):

public long getFilePointer() throws IOException {     return this.curpos;   }

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

时间:2011-06-19 崔志翔

提供对当前位置的多个字节的缓冲写功能:

public void write(byte b[], int off, int len) throws IOException {     long writeendpos = this.curpos + len - 1;     if (writeendpos <= this.bufendpos) { // b[] in cur buf System.arraycopy(b, off, this.buf, (int)(this.curpos - this.bufstartpos), len);       this.bufdirty = true;       this.bufusedsize = (int)(writeendpos - this.bufstartpos + 1);     } else { // b[] not in cur buf       super.seek(this.curpos);       super.write(b, off, len);     }     if (writeendpos > this.fileendpos)       this.fileendpos = writeendpos;     this.seek(writeendpos+1); }   public void write(byte b[]) throws IOException {     this.write(b, 0, b.length);   }

提供对当前位置的多个字节的缓冲读功能:

public int read(byte b[], int off, int len) throws IOException { long readendpos = this.curpos + len - 1;   if (readendpos <= this.bufendpos && readendpos <= this.fileendpos ) { // read in buf      System.arraycopy(this.buf, (int)(this.curpos - this.bufstartpos), b, off, len);   } else { // read b[] size > buf[]       if (readendpos > this.fileendpos) { // read b[] part in file        len = (int)(this.length() - this.curpos + 1);     }     super.seek(this.curpos);     len = super.read(b, off, len);     readendpos = this.curpos + len - 1;   }     this.seek(readendpos + 1);     return len; }   public int read(byte b[]) throws IOException {     return this.read(b, 0, b.length);   } public void setLength(long newLength) throws IOException {     if (newLength > 0) {       this.fileendpos = newLength - 1;     } else {       this.fileendpos = 0;     }     super.setLength(newLength); } public void close() throws IOException {     this.flushbuf();     super.close();     }

至此完善工作基本完成,试一下新增的多字节读/写功能,通过同时读/写 1024个字节,来COPY一个12兆的文件,(这里牵涉到读和写,用完善后 BufferedRandomAccessFile试一下读/写的速度):

耗用时间(秒)
RandomAccessFile RandomAccessFile 95.848
BufferedInputStream + DataInputStream BufferedOutputStream + DataOutputStream 2.935
BufferedRandomAccessFile BufferedOutputStream + DataOutputStream 2.813
BufferedRandomAccessFile BufferedRandomAccessFile 2.453
BufferedRandomAccessFile优 BufferedRandomAccessFile优 2.197
BufferedRandomAccessFile完 BufferedRandomAccessFile完 0.401

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号