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  }