@Override public long skip(long n) { if (n > length - position) n = length - position; position += n; updateCurrent(); return n; }
@Override public int read() { if (length == position) return -1; final int disp = (int)(position++ & SLICE_MASK); if (disp == 0) updateCurrent(); return current[disp] & 0xFF; }
@Override public void position(final long newPosition) { position = Math.min(newPosition, length); updateCurrent(); }
@Override public int read(final byte[] b, int offset, final int length) { final long remaining = this.length - position; if (remaining == 0) return length == 0 ? 0 : -1; int n = (int)Math.min(length, remaining); final int m = n; for(;;) { final int disp = (int)(position & SLICE_MASK); if (disp == 0) updateCurrent(); final int res = Math.min(n, current.length - disp); System.arraycopy(current, disp, b, offset, res); n -= res; position += res; if (n == 0) return m; offset += res; } }