通过扩展RandomAccessFile类使之具备Buffer改善I/O性能 - 编程入门网
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试一下读的速度):
可见速度显著提高,与BufferedInputStream+DataInputStream不相上下。 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能(4)时间:2011-06-19 崔志翔2.3.实现写缓冲。 写缓冲逻辑的基本原理: A欲写文件POS位置的一个字节。 B 查BUF中是否有该映射?若有,直接向BUF中写入,并返回true。 C若没有,则BUF重新定位到该POS所在的位置,并把该位置附近的 BUFSIZE字 节的文件内容填充BUFFER,返回B。 下面给出关键部分代码及其说明:
|
||||||||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |