X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FMarkableFileInputStream.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FMarkableFileInputStream.java;h=dab4cdc45a536f993f8e6924d89ef4fdd5780e32;hb=8e76f6ab13a8a4a651f2518b6c91d5e6424c7922;hp=0000000000000000000000000000000000000000;hpb=a26188d393b11040b8ee8476338a73bfadabffb6;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/streams/MarkableFileInputStream.java b/src/be/nikiroo/utils/streams/MarkableFileInputStream.java new file mode 100644 index 0000000..dab4cdc --- /dev/null +++ b/src/be/nikiroo/utils/streams/MarkableFileInputStream.java @@ -0,0 +1,51 @@ +package be.nikiroo.utils.streams; + +import java.io.FileInputStream; +import java.io.FilterInputStream; +import java.io.IOException; +import java.nio.channels.FileChannel; + +/** + * This is a markable (and thus reset-able) stream that you can create from a + * FileInputStream. + * + * @author niki + */ +public class MarkableFileInputStream extends FilterInputStream { + private FileChannel channel; + private long mark = 0; + + /** + * Create a new {@link MarkableFileInputStream} from this stream. + * + * @param in + * the original {@link FileInputStream} to wrap + */ + public MarkableFileInputStream(FileInputStream in) { + super(in); + channel = in.getChannel(); + } + + @Override + public boolean markSupported() { + return true; + } + + @Override + public synchronized void mark(int readlimit) { + try { + mark = channel.position(); + } catch (IOException ex) { + ex.printStackTrace(); + mark = -1; + } + } + + @Override + public synchronized void reset() throws IOException { + if (mark < 0) { + throw new IOException("mark position not valid"); + } + channel.position(mark); + } +} \ No newline at end of file