论坛首页 入门技术论坛

【原创】java.io.InputStream优化

浏览 3843 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-02-28  
今天无聊看java源码时发现 java.io.InputStream类用于移动文件指针的skip()方法可以再优化一下:

源码:
public long skip(long n) throws IOException {

	long remaining = n;
	int nr;
	if (skipBuffer == null)
	    skipBuffer = new byte[SKIP_BUFFER_SIZE];   

	byte[] localSkipBuffer = skipBuffer;
		
	if (n <= 0) {
	    return 0;
	}

	while (remaining > 0) {
	    nr = read(localSkipBuffer, 0,
		      (int) Math.min(SKIP_BUFFER_SIZE, remaining));
	    if (nr < 0) {
		break;
	    }
	    remaining -= nr;
	}
	
	return n - remaining;
    }


可以优化为:
public long skip(long n) throws IOException {
		if (n <= 0) {
		    return 0;
		}
		
		int i=0;
		while ( read() != -1 && i < n) {
		    i++;
		}
		
		return i;
	}



这样即节省了skipBuffer 2048个空间,代码也更简单;
继续看了一下子类的代码,都覆盖了这个方法。但优化后的方法总比优化前强!
   发表时间:2008-02-28  

瀑布汗.....

0 请登录后投票
   发表时间:2008-02-28  
人家原来是一块一块的读
你给改成了一个字节一个字节的读
。。。。。。。。。
0 请登录后投票
   发表时间:2008-02-29  
引用
jsyx 19 小时前
人家原来是一块一块的读
你给改成了一个字节一个字节的读
。。。。。。。。。


nr = read(localSkipBuffer, 0,  (int) Math.min(SKIP_BUFFER_SIZE, remaining));  
这个方法的内部实现也是一个一个读的,这里它里面的代码:

public int read(byte b[], int off, int len) throws IOException {
	if (b == null) {
	    throw new NullPointerException();
	} else if ((off < 0) || (off > b.length) || (len < 0) ||
		   ((off + len) > b.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return 0;
	}

	int c = read();
	if (c == -1) {
	    return -1;
	}
	b[off] = (byte)c;

	int i = 1;
	try {
	    for (; i < len ; i++) {
		c = read();
		if (c == -1) {
		    break;
		}
		if (b != null) {
		    b[off + i] = (byte)c;
		}
	    }
	} catch (IOException ee) {
	}
	return i;
    }


如果从硬盘读数据是一块一块读的,如果内存中读数据的话,比如数组的copy,肯定先申请一段空间,然后是一个一个读的和写。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics