Add 'src/be/nikiroo/utils/' from commit '46add0670fdee4bd936a13fe2448c5e20a7ffd0a'
[fanfix.git] / src / be / nikiroo / utils / streams / MarkableFileInputStream.java
diff --git a/src/be/nikiroo/utils/streams/MarkableFileInputStream.java b/src/be/nikiroo/utils/streams/MarkableFileInputStream.java
new file mode 100644 (file)
index 0000000..7622b24
--- /dev/null
@@ -0,0 +1,66 @@
+package be.nikiroo.utils.streams;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+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 file.
+        * 
+        * @param file
+        *            the {@link File} to wrap
+        * 
+        * @throws FileNotFoundException
+        *             if the {@link File} cannot be found
+        */
+       public MarkableFileInputStream(File file) throws FileNotFoundException {
+               this(new FileInputStream(file));
+       }
+
+       /**
+        * 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