@Override public int read(byte[] target, int offset, int length) throws IOException, InterruptedException { if (Thread.interrupted()) { throw new InterruptedException(); } int peekBytes = Math.min(peekBufferLength, length); System.arraycopy(peekBuffer, 0, target, offset, peekBytes); offset += peekBytes; length -= peekBytes; int bytesRead = length != 0 ? dataSource.read(target, offset, length) : 0; if (bytesRead == C.RESULT_END_OF_INPUT) { return C.RESULT_END_OF_INPUT; } updatePeekBuffer(peekBytes); bytesRead += peekBytes; position += bytesRead; return bytesRead; }
@Override public void skipFully(int length) throws IOException, InterruptedException { int peekBytes = Math.min(peekBufferLength, length); int remaining = length - peekBytes; while (remaining > 0) { if (Thread.interrupted()) { throw new InterruptedException(); } int bytesRead = dataSource.read(SCRATCH_SPACE, 0, Math.min(SCRATCH_SPACE.length, remaining)); if (bytesRead == C.RESULT_END_OF_INPUT) { throw new EOFException(); } remaining -= bytesRead; } updatePeekBuffer(peekBytes); position += length; }
@Override public boolean readFully(byte[] target, int offset, int length, boolean allowEndOfInput) throws IOException, InterruptedException { int peekBytes = Math.min(peekBufferLength, length); System.arraycopy(peekBuffer, 0, target, offset, peekBytes); offset += peekBytes; int remaining = length - peekBytes; while (remaining > 0) { if (Thread.interrupted()) { throw new InterruptedException(); } int bytesRead = dataSource.read(target, offset, remaining); if (bytesRead == C.RESULT_END_OF_INPUT) { if (allowEndOfInput && remaining == length) { return false; } throw new EOFException(); } offset += bytesRead; remaining -= bytesRead; } updatePeekBuffer(peekBytes); position += length; return true; }