## javax.mail.util
Class SharedFileInputStream

    java.lang.Object
      java.io.InputStream
          java.io.FilterInputStream
              java.io.BufferedInputStream
                  javax.mail.util.SharedFileInputStream

All Implemented Interfaces:
  java.io.Closeable, SharedInputStream

    public class SharedFileInputStream

extends java.io.BufferedInputStream
implements SharedInputStream

A `SharedFileInputStream` is a `BufferedInputStream` that buffers data from the file and supports the `mark` and `reset` methods. It also supports the `newStream` method that allows you to create other streams that represent subsets of the file. A `RandomAccessFile` object is used to access the file data.

Note that when the SharedFileInputStream is closed, all streams created with the `newStream` method are also closed. This allows the creator of the SharedFileInputStream object to control access to the underlying file and ensure that it is closed when needed, to avoid leaking file descriptors. Note also that this behavior contradicts the requirements of SharedInputStream and may change in a future release.

Since:
  JavaMail 1.4

Field Summary
`protected long` `bufpos` The file offset that corresponds to the first byte in the read buffer.
`protected int` `bufsize` The normal size of the read buffer.
`protected long` `datalen` The amount of data in this subset of the file.
`protected java.io.RandomAccessFile` `in` The file containing the data.
`protected long` `start` The file offset of the start of data in this subset of the file.

Fields inherited from class java.io.BufferedInputStream
`buf, count, marklimit, markpos, pos`

Constructor Summary
`SharedFileInputStream(java.io.File file)` Creates a `SharedFileInputStream` for the file.
`SharedFileInputStream(java.io.File file, int size)` Creates a `SharedFileInputStream` with the specified buffer size.
`SharedFileInputStream(java.lang.String file)` Creates a `SharedFileInputStream` for the named file
`SharedFileInputStream(java.lang.String file, int size)` Creates a `SharedFileInputStream` with the specified buffer size.

Method Summary
`int` `available()` Returns the number of bytes that can be read from this input stream without blocking.
`void` `close()` Closes this input stream and releases any system resources associated with the stream.
`protected void` `finalize()` Force this stream to close.
`long` `getPosition()` Return the current position in the InputStream, as an offset from the beginning of the InputStream.
`void` `mark(int readlimit)` See the general contract of the `mark` method of `InputStream`.
`boolean` `markSupported()` Tests if this input stream supports the `mark` and `reset` methods.
`java.io.InputStream` `newStream(long start, long end)` Return a new InputStream representing a subset of the data from this InputStream, starting at `start` (inclusive) up to `end` (exclusive).
`int` `read()` See the general contract of the `read` method of `InputStream`.
`int` `read(byte[] b, int off, int len)` Reads bytes from this stream into the specified byte array, starting at the given offset.
`void` `reset()` See the general contract of the `reset` method of `InputStream`.
`long` `skip(long n)` See the general contract of the `skip` method of `InputStream`.

Methods inherited from class java.io.FilterInputStream
`read`

Methods inherited from class java.lang.Object
`clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### in

    protected java.io.RandomAccessFile in

  The file containing the data. Shared by all related SharedFileInputStreams.

### bufsize

    protected int bufsize

  The normal size of the read buffer.

### bufpos

    protected long bufpos

  The file offset that corresponds to the first byte in the read buffer.

### start

    protected long start

  The file offset of the start of data in this subset of the file.

### datalen

    protected long datalen

  The amount of data in this subset of the file.

Constructor Detail

### SharedFileInputStream

    public SharedFileInputStream(java.io.File file)
                          throws java.io.IOException

  Creates a `SharedFileInputStream` for the file.

  Parameters:
    `file` - the file
  Throws:
    `java.io.IOException`

### SharedFileInputStream

    public SharedFileInputStream(java.lang.String file)
                          throws java.io.IOException

  Creates a `SharedFileInputStream` for the named file

  Parameters:
    `file` - the file
  Throws:
    `java.io.IOException`

### SharedFileInputStream

    public SharedFileInputStream(java.io.File file,
                                 int size)
                          throws java.io.IOException

  Creates a `SharedFileInputStream` with the specified buffer size.

  Parameters:
    `file` - the file
    `size` - the buffer size.
  Throws:
    `java.lang.IllegalArgumentException` - if size <= 0.
    `java.io.IOException`

### SharedFileInputStream

    public SharedFileInputStream(java.lang.String file,
                                 int size)
                          throws java.io.IOException

  Creates a `SharedFileInputStream` with the specified buffer size.

  Parameters:
    `file` - the file
    `size` - the buffer size.
  Throws:
    `java.lang.IllegalArgumentException` - if size <= 0.
    `java.io.IOException`

Method Detail

### read

    public int read()
             throws java.io.IOException

  See the general contract of the `read` method of `InputStream`.

  Overrides:
    `read` in class `java.io.BufferedInputStream`
  Returns:
    the next byte of data, or `-1` if the end of the stream is reached.
  Throws:
    `java.io.IOException` - if an I/O error occurs.

### read

    public int read(byte[] b,
                    int off,
                    int len)
             throws java.io.IOException

  Reads bytes from this stream into the specified byte array, starting at the given offset.

  This method implements the general contract of the corresponding ``read`` method of the ``InputStream`` class.

  Overrides:
    `read` in class `java.io.BufferedInputStream`
  Parameters:
    `b` - destination buffer.
    `off` - offset at which to start storing bytes.
    `len` - maximum number of bytes to read.
  Returns:
    the number of bytes read, or `-1` if the end of the stream has been reached.
  Throws:
    `java.io.IOException` - if an I/O error occurs.

### skip

    public long skip(long n)
              throws java.io.IOException

  See the general contract of the `skip` method of `InputStream`.

  Overrides:
    `skip` in class `java.io.BufferedInputStream`
  Parameters:
    `n` - the number of bytes to be skipped.
  Returns:
    the actual number of bytes skipped.
  Throws:
    `java.io.IOException` - if an I/O error occurs.

### available

    public int available()
                  throws java.io.IOException

  Returns the number of bytes that can be read from this input stream without blocking.

  Overrides:
    `available` in class `java.io.BufferedInputStream`
  Returns:
    the number of bytes that can be read from this input stream without blocking.
  Throws:
    `java.io.IOException` - if an I/O error occurs.

### mark

    public void mark(int readlimit)

  See the general contract of the `mark` method of `InputStream`.

  Overrides:
    `mark` in class `java.io.BufferedInputStream`
  Parameters:
    `readlimit` - the maximum limit of bytes that can be read before the mark position becomes invalid.
  See Also:
    `reset()`

### reset

    public void reset()
               throws java.io.IOException

  See the general contract of the `reset` method of `InputStream`.

  If `markpos` is `-1` (no mark has been set or the mark has been invalidated), an `IOException` is thrown. Otherwise, `pos` is set equal to `markpos`.

  Overrides:
    `reset` in class `java.io.BufferedInputStream`
  Throws:
    `java.io.IOException` - if this stream has not been marked or if the mark has been invalidated.
  See Also:
    `mark(int)`

### markSupported

    public boolean markSupported()

  Tests if this input stream supports the `mark` and `reset` methods. The `markSupported` method of `SharedFileInputStream` returns `true`.

  Overrides:
    `markSupported` in class `java.io.BufferedInputStream`
  Returns:
    a `boolean` indicating if this stream type supports the `mark` and `reset` methods.
  See Also:
    `InputStream.mark(int)`, `InputStream.reset()`

### close

    public void close()
               throws java.io.IOException

  Closes this input stream and releases any system resources associated with the stream.

  Specified by:
    `close` in interface `java.io.Closeable`
  Overrides:
    `close` in class `java.io.BufferedInputStream`
  Throws:
    `java.io.IOException` - if an I/O error occurs.

### getPosition

    public long getPosition()

  Return the current position in the InputStream, as an offset from the beginning of the InputStream.

  Specified by:
    `getPosition` in interface `SharedInputStream`
  Returns:
    the current position

### newStream

    public java.io.InputStream newStream(long start,
                                         long end)

  Return a new InputStream representing a subset of the data from this InputStream, starting at `start` (inclusive) up to `end` (exclusive). `start` must be non-negative. If `end` is -1, the new stream ends at the same place as this stream. The returned InputStream will also implement the SharedInputStream interface.

  Specified by:
    `newStream` in interface `SharedInputStream`
  Parameters:
    `start` - the starting position
    `end` - the ending position + 1
  Returns:
    the new stream

### finalize

    protected void finalize()
                     throws java.lang.Throwable

  Force this stream to close.

  Overrides:
    `finalize` in class `java.lang.Object`
  Throws:
    `java.lang.Throwable`