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:
  `Closeable`, `AutoCloseable`, `SharedInputStream`

public class SharedFileInputStream extends 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
Modifier and Type
Field
Description
`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 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
Constructor
Description
`SharedFileInputStream(File file)`
Creates a `SharedFileInputStream` for the file.
`SharedFileInputStream(File file, int size)`
Creates a `SharedFileInputStream` with the specified buffer size.
`SharedFileInputStream(String file)`
Creates a `SharedFileInputStream` for the named file
`SharedFileInputStream(String file, int size)`
Creates a `SharedFileInputStream` with the specified buffer size.

## Method Summary

Modifier and Type
Method
Description
`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.
`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, skipNBytes, transferTo`

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### in

protected 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 Details

### SharedFileInputStream

public SharedFileInputStream(File file) throws IOException
Creates a `SharedFileInputStream` for the file.

Parameters:
  `file` - the file
Throws:
  `IOException` - for errors opening the file

### SharedFileInputStream

public SharedFileInputStream(String file) throws IOException
Creates a `SharedFileInputStream` for the named file

Parameters:
  `file` - the file
Throws:
  `IOException` - for errors opening the file

### SharedFileInputStream

public SharedFileInputStream(File file, int size) throws IOException
Creates a `SharedFileInputStream` with the specified buffer size.

Parameters:
  `file` - the file
  `size` - the buffer size.
Throws:
  `IOException` - for errors opening the file
  `IllegalArgumentException` - if size ≤ 0.

### SharedFileInputStream

public SharedFileInputStream(String file, int size) throws IOException
Creates a `SharedFileInputStream` with the specified buffer size.

Parameters:
  `file` - the file
  `size` - the buffer size.
Throws:
  `IOException` - for errors opening the file
  `IllegalArgumentException` - if size ≤ 0.

## Method Details

### read

public int read() throws IOException
See the general contract of the `read` method of `InputStream`.

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

### read

public int read(byte[] b, int off, int len) throws 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 `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:
  `IOException` - if an I/O error occurs.

### skip

public long skip(long n) throws IOException
See the general contract of the `skip` method of `InputStream`.

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

### available

public int available() throws IOException
Returns the number of bytes that can be read from this input stream without blocking.

Overrides:
  `available` in class `BufferedInputStream`
Returns:
  the number of bytes that can be read from this input stream without blocking.
Throws:
  `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 `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 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 `BufferedInputStream`
Throws:
  `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 `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 IOException
Closes this input stream and releases any system resources associated with the stream.

Specified by:
  `close` in interface `AutoCloseable`
Specified by:
  `close` in interface `Closeable`
Overrides:
  `close` in class `BufferedInputStream`
Throws:
  `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 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 Throwable
Force this stream to close.

Overrides:
  `finalize` in class `Object`
Throws:
  `Throwable`