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 java.io.IOException;
27 import java.io.Reader;
28
29 import it.unimi.dsi.fastutil.io.RepositionableStream;
30
31
32 /***
33 * Base class for repositionable readers.
34 *
35 * @author pjack
36 */
37 public abstract class SeekReader extends Reader
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 @Override
56 public void mark(int limit) {
57 try {
58 this.mark = position();
59 } catch (IOException e) {
60 mark = -1;
61 }
62 }
63
64
65 /***
66 * Resets this stream to its marked position.
67 *
68 * @throws IOException if there is no mark, or if an IO error occurs
69 */
70 @Override
71 public void reset() throws IOException {
72 if (mark < 0) {
73 throw new IOException("No mark.");
74 }
75 position(mark);
76 }
77
78
79 /***
80 * Returns true, since SeekInputStreams support mark/reset by default.
81 *
82 * @return true
83 */
84 @Override
85 public boolean markSupported() {
86 return true;
87 }
88 }