Package 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`, `java.lang.AutoCloseable`, `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
Author:
  Bill Shannon

### Field Summary

Fields
`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

Constructors
`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

All Methods Instance Methods Concrete Methods
`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.io.InputStream

`nullInputStream, readAllBytes, readNBytes, readNBytes, transferTo`

### 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` - for errors opening the file

#### 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` - for errors opening the file

#### 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.io.IOException` - for errors opening the file
  `java.lang.IllegalArgumentException` - if size ≤ 0.

#### 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.io.IOException` - for errors opening the file
  `java.lang.IllegalArgumentException` - if size ≤ 0.

### 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.lang.AutoCloseable`
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`