| /* |
| * SeekableInputStream |
| * |
| * Author: Lasse Collin <lasse.collin@tukaani.org> |
| * |
| * This file has been put into the public domain. |
| * You can do whatever you want with this file. |
| */ |
| |
| package org.tukaani.xz; |
| |
| import java.io.InputStream; |
| import java.io.IOException; |
| |
| /** |
| * Input stream with random access support. |
| */ |
| public abstract class SeekableInputStream extends InputStream { |
| /** |
| * Seeks <code>n</code> bytes forward in this stream. |
| * <p> |
| * This will not seek past the end of the file. If the current position |
| * is already at or past the end of the file, this doesn't seek at all |
| * and returns <code>0</code>. Otherwise, if skipping <code>n</code> bytes |
| * would cause the position to exceed the stream size, this will do |
| * equivalent of <code>seek(length())</code> and the return value will |
| * be adjusted accordingly. |
| * <p> |
| * If <code>n</code> is negative, the position isn't changed and |
| * the return value is <code>0</code>. It doesn't seek backward |
| * because it would conflict with the specification of |
| * {@link java.io.InputStream#skip(long) InputStream.skip}. |
| * |
| * @return <code>0</code> if <code>n</code> is negative, |
| * less than <code>n</code> if skipping <code>n</code> |
| * bytes would seek past the end of the file, |
| * <code>n</code> otherwise |
| * |
| * @throws IOException might be thrown by {@link #seek(long)} |
| */ |
| public long skip(long n) throws IOException { |
| if (n <= 0) |
| return 0; |
| |
| long size = length(); |
| long pos = position(); |
| if (pos >= size) |
| return 0; |
| |
| if (size - pos < n) |
| n = size - pos; |
| |
| seek(pos + n); |
| return n; |
| } |
| |
| /** |
| * Gets the size of the stream. |
| */ |
| public abstract long length() throws IOException; |
| |
| /** |
| * Gets the current position in the stream. |
| */ |
| public abstract long position() throws IOException; |
| |
| /** |
| * Seeks to the specified absolute position in the stream. |
| * <p> |
| * Seeking past the end of the file should be supported by the subclasses |
| * unless there is a good reason to do otherwise. If one has seeked |
| * past the end of the stream, <code>read</code> will return |
| * <code>-1</code> to indicate end of stream. |
| * |
| * @param pos new read position in the stream |
| * |
| * @throws IOException if <code>pos</code> is negative or if |
| * a stream-specific I/O error occurs |
| */ |
| public abstract void seek(long pos) throws IOException; |
| } |