1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.archive.io;
24
25
26 import it.unimi.dsi.fastutil.io.RepositionableStream;
27
28 import java.io.IOException;
29 import java.io.InputStream;
30
31
32 /***
33 * Base class for repositionable input streams.
34 *
35 * @author pjack
36 */
37 public abstract class SeekInputStream extends InputStream
38 implements RepositionableStream {
39
40
41 /***
42 * The marked file position. A value less than zero
43 * indicates that no mark has been set.
44 */
45 private long mark = -1;
46
47
48 /***
49 * Marks the current position of the stream. The limit parameter is
50 * ignored; the mark will remain valid until reset is called or the
51 * stream is closed.
52 *
53 * @param limit ignored
54 */
55 public void mark(int limit) {
56 try {
57 this.mark = position();
58 } catch (IOException e) {
59 mark = -1;
60 }
61 }
62
63
64 /***
65 * Resets this stream to its marked position.
66 *
67 * @throws IOException if there is no mark, or if an IO error occurs
68 */
69 public void reset() throws IOException {
70 if (mark < 0) {
71 throw new IOException("No mark.");
72 }
73 position(mark);
74 }
75
76
77 /***
78 * Returns true, since SeekInputStreams support mark/reset by default.
79 *
80 * @return true
81 */
82 public boolean markSupported() {
83 return true;
84 }
85 }