public class ByteBufferInputStream extends MeasurableInputStream implements RepositionableStream
Java's memory-mapping facilities have
the severe limitation of mapping at most Integer.MAX_VALUE
bytes, as they
expose the content of a file using a MappedByteBuffer
. This class can expose
a file of arbitrary length as a repositionable MeasurableInputStream
that is actually based on an array of MappedByteBuffer
s, each mapping
a chunk of CHUNK_SIZE
bytes.
Modifier and Type | Field and Description |
---|---|
static long |
CHUNK_SIZE
The size of a chunk created by
map(FileChannel, FileChannel.MapMode) . |
Modifier | Constructor and Description |
---|---|
|
ByteBufferInputStream(ByteBuffer byteBuffer)
Creates a new byte-buffer input stream from a single
ByteBuffer . |
protected |
ByteBufferInputStream(ByteBuffer[] byteBuffer,
long size,
int curr,
boolean[] readyToUse)
Creates a new byte-buffer input stream.
|
Modifier and Type | Method and Description |
---|---|
int |
available() |
ByteBufferInputStream |
copy() |
long |
length() |
static ByteBufferInputStream |
map(FileChannel fileChannel)
Creates a new read-only byte-buffer input stream by mapping a given file channel.
|
static ByteBufferInputStream |
map(FileChannel fileChannel,
FileChannel.MapMode mapMode)
Creates a new byte-buffer input stream by mapping a given file channel.
|
void |
mark(int unused) |
boolean |
markSupported() |
long |
position() |
void |
position(long newPosition) |
int |
read() |
int |
read(byte[] b,
int offset,
int length) |
void |
reset() |
long |
skip(long n) |
close, read
public static final long CHUNK_SIZE
map(FileChannel, FileChannel.MapMode)
.public ByteBufferInputStream(ByteBuffer byteBuffer)
ByteBuffer
.byteBuffer
- the underlying byte buffer.protected ByteBufferInputStream(ByteBuffer[] byteBuffer, long size, int curr, boolean[] readyToUse)
byteBuffer
- the underlying byte buffers.size
- the sum of the capacities of the byte buffers.curr
- the current buffer (reading will start at this buffer from its current position).readyToUse
- an array parallel to byteBuffer
specifying which buffers do not need to be
duplicated before being used (the process will happen lazily); the array
will be used internally by the newly created byte-buffer input stream.public static ByteBufferInputStream map(FileChannel fileChannel) throws IOException
fileChannel
- the file channel that will be mapped.fileChannel
.IOException
public static ByteBufferInputStream map(FileChannel fileChannel, FileChannel.MapMode mapMode) throws IOException
fileChannel
- the file channel that will be mapped.mapMode
- this must be FileChannel.MapMode.READ_ONLY
.fileChannel
.IOException
public int available()
available
in class InputStream
public boolean markSupported()
markSupported
in class InputStream
public void mark(int unused)
mark
in class InputStream
public void reset() throws IOException
reset
in class InputStream
IOException
public long skip(long n) throws IOException
skip
in class InputStream
IOException
public int read()
read
in class InputStream
public int read(byte[] b, int offset, int length)
read
in class InputStream
public long length()
length
in interface MeasurableStream
public long position()
position
in interface MeasurableStream
position
in interface RepositionableStream
public void position(long newPosition)
position
in interface RepositionableStream
public ByteBufferInputStream copy()