public int read(byte[] buffer, int pos, int len) throws IOException { if (transparent) { return (input.read(buffer, pos, len)); } // [header] // file [body-start -> body-end] long start_pos = seek_position; int start_len = len; if (seek_position < header.length) { int rem = (int) (header.length - seek_position); if (rem > len) { rem = len; } System.arraycopy(header, (int) seek_position, buffer, pos, rem); pos += rem; len -= rem; seek_position += rem; } if (len > 0) { long file_position = body_start + seek_position - header.length; long rem = body_end - file_position; if (len < rem) { rem = len; } input.seek(file_position); int temp = input.read(buffer, pos, (int) rem); pos += temp; len -= temp; seek_position += temp; } int read = start_len - len; seek_position = start_pos + read; return (read); }