浏览 3853 次
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-28
源码: 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个空间,代码也更简单; 继续看了一下子类的代码,都覆盖了这个方法。但优化后的方法总比优化前强! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-02-28
瀑布汗..... |
|
返回顶楼 | |
发表时间:2008-02-28
人家原来是一块一块的读
你给改成了一个字节一个字节的读 。。。。。。。。。 |
|
返回顶楼 | |
发表时间: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,肯定先申请一段空间,然后是一个一个读的和写。 |
|
返回顶楼 | |