View Javadoc

1   /* SeekReader
2   *
3   * Created on September 18, 2006
4   *
5   * Copyright (C) 2006 Internet Archive.
6   *
7   * This file is part of the Heritrix web crawler (crawler.archive.org).
8   *
9   * Heritrix is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * any later version.
13  *
14  * Heritrix is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser Public License
20  * along with Heritrix; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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  }