快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

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

时间:2011-06-19 崔志翔

主体:

目前最流行的J2SDK版本是1.3系列。使用该版本的开发人员需文件随机存取 ,就得使用RandomAccessFile类。其I/O性能较之其它常用开发语言的同类性能 差距甚远,严重影响程序的运行效率。

开发人员迫切需要提高效率,下面分析RandomAccessFile等文件类的源代码 ,找出其中的症结所在,并加以改进优化,创建一个"性/价比"俱佳 的随机文件访问类BufferedRandomAccessFile。

在改进之前先做一个基本测试:逐字节COPY一个12兆的文件(这里牵涉到读 和写)。

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

我们可以看到两者差距约32倍,RandomAccessFile也太慢了。先看看两者关 键部分的源代码,对比分析,找出原因。

1.1.[RandomAccessFile]

public class RandomAccessFile implements DataOutput, DataInput {   public final byte readByte() throws IOException {     int ch = this.read();     if (ch < 0)       throw new EOFException();     return (byte)(ch);   }   public native int read() throws IOException;   public final void writeByte(int v) throws IOException {     write(v);   }   public native void write(int b) throws IOException; }

可见,RandomAccessFile每读/写一个字节就需对磁盘进行一次I/O操作。

1.2.[BufferedInputStream]

public class BufferedInputStream extends FilterInputStream {   private static int defaultBufferSize = 2048;   protected byte buf[]; // 建立读缓存区   public BufferedInputStream(InputStream in, int size) {     super(in);         if (size <= 0) {       throw new IllegalArgumentException("Buffer size <= 0");     }     buf = new byte[size];   }   public synchronized int read() throws IOException {     ensureOpen();     if (pos >= count) {       fill();       if (pos >= count)         return -1;     }     return buf[pos++] & 0xff; // 直接从BUF[]中读取   }   private void fill() throws IOException {   if (markpos < 0)     pos = 0;    /* no mark: throw away the buffer */   else if (pos >= buf.length)  /* no room left in buffer */     if (markpos > 0) {  /* can throw away early part of the buffer */     int sz = pos - markpos;     System.arraycopy(buf, markpos, buf, 0, sz);     pos = sz;     markpos = 0;     } else if (buf.length >= marklimit) {     markpos = -1;  /* buffer got too big, invalidate mark */     pos = 0;  /* drop buffer contents */     } else {    /* grow buffer */     int nsz = pos * 2;     if (nsz > marklimit)       nsz = marklimit;     byte nbuf[] = new byte[nsz];     System.arraycopy(buf, 0, nbuf, 0, pos);     buf = nbuf;     }   count = pos;   int n = in.read

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