View Javadoc

1   /* SeekInputStream
2   *
3   * Created on September 12, 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 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  }