快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
(buf, pos, buf.length - pos);   if (n > 0)     count = n + pos;   } }

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

时间:2011-06-19 崔志翔

1.3.[BufferedOutputStream]

public class BufferedOutputStream extends FilterOutputStream {   protected byte buf[]; // 建立写缓存区   public BufferedOutputStream(OutputStream out, int size) {     super(out);     if (size <= 0) {       throw new IllegalArgumentException("Buffer size <= 0");     }     buf = new byte[size];   } public synchronized void write(int b) throws IOException {     if (count >= buf.length) {         flushBuffer();     }     buf[count++] = (byte)b; // 直接从BUF[]中读取   }   private void flushBuffer() throws IOException {     if (count > 0) {       out.write(buf, 0, count);       count = 0;     }   } }

可见,Buffered I/O putStream每读/写一个字节,若要操作的数据在BUF中 ,就直接对内存的buf[]进行读/写操作;否则从磁盘相应位置填充buf[],再直 接对内存的buf[]进行读/写操作,绝大部分的读/写操作是对内存buf[]的操作。

1.3.小结

内存存取时间单位是纳秒级(10E-9),磁盘存取时间单位是毫秒级(10E-3 ),同样操作一次的开销,内存比磁盘快了百万倍。理论上可以预见,即使对内 存操作上万次,花费的时间也远少对于磁盘一次I/O的开销。显然后者是通过增 加位于内存的BUF存取,减少磁盘I/O的开销,提高存取效率的,当然这样也增加 了BUF控制部分的开销。从实际应用来看,存取效率提高了32倍。

根据1.3得出的结论,现试着对RandomAccessFile类也加上缓冲读写机制。

随机访问类与顺序类不同,前者是通过实现DataInput/DataOutput接口创建 的,而后者是扩展FilterInputStream/FilterOutputStream创建的,不能直接照 搬。

2.1.开辟缓冲区BUF[默认:1024字节],用作读/写的共用缓冲区。

2.2.先实现读缓冲。

读缓冲逻辑的基本原理:

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

B 查BUF中是否存在?若有,直接从BUF中读取,并返回该字符BYTE。

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

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

时间:2011-06-19 崔志翔

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

public class BufferedRandomAccessFile extends RandomAccessFile { // byte read(long pos):读取当前文件POS位置所在的字节 // bufstartpos、bufendpos代表BUF映射在当前文件的首/尾偏移地址。 // curpos指当前类文件指针的偏移地址。   public byte read(long pos) throws IOException {     if (pos < this.bufstartpos || pos > this.bufendpos ) {       this.flushbuf();       this.seek(pos);       if ((pos < this.bufstartpos) || (pos > this.bufendpos))         throw new IOException();     }     this.curpos = pos;     return this.buf[(int)(pos - this.bufstartpos)];   } // void flushbuf():bufdirty为真,把buf[]中尚未写入磁盘的数据,写入磁 盘。   private void flushbuf() throws IOException {     if (this.bufdirty == true) {       if (super.getFilePointer() != this.bufstartpos) {         super.seek(this.bufstartpos);       }       super.wri

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