Package org.apache.commons.io.input
Class BufferedFileChannelInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.apache.commons.io.input.BufferedFileChannelInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
public final class BufferedFileChannelInputStream extends java.io.InputStream
InputStream
implementation which uses direct buffer to read a file to avoid extra copy of data between Java and native memory which happens when usingBufferedInputStream
. Unfortunately, this is not something already available in JDK,sun.nio.ch.ChannelInputStream
supports reading a file using NIO, but does not support buffering.To build an instance, see
BufferedFileChannelInputStream.Builder
.This class was ported and adapted from Apache Spark commit 933dc6cb7b3de1d8ccaf73d124d6eb95b947ed19 where it was called
NioBufferedFileInputStream
.- Since:
- 2.9.0
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
BufferedFileChannelInputStream.Builder
Builds a newBufferedFileChannelInputStream
instance.
-
Field Summary
Fields Modifier and Type Field Description private java.nio.ByteBuffer
byteBuffer
private java.nio.channels.FileChannel
fileChannel
-
Constructor Summary
Constructors Constructor Description BufferedFileChannelInputStream(java.io.File file)
Deprecated.BufferedFileChannelInputStream(java.io.File file, int bufferSize)
Deprecated.BufferedFileChannelInputStream(java.nio.file.Path path)
Deprecated.BufferedFileChannelInputStream(java.nio.file.Path path, int bufferSize)
Deprecated.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description int
available()
static BufferedFileChannelInputStream.Builder
builder()
Constructs a newBufferedFileChannelInputStream.Builder
.private void
clean(java.nio.ByteBuffer buffer)
Attempts to clean up a ByteBuffer if it is direct or memory-mapped.private void
cleanDirectBuffer(java.nio.ByteBuffer buffer)
In Java 8, the type ofsun.nio.ch.DirectBuffer.cleaner()
wassun.misc.Cleaner
, and it was possible to access the methodsun.misc.Cleaner.clean()
to invoke it.void
close()
int
read()
int
read(byte[] b, int offset, int len)
private boolean
refill()
Checks whether data is left to be read from the input stream.long
skip(long n)
private long
skipFromFileChannel(long n)
-
-
-
Constructor Detail
-
BufferedFileChannelInputStream
@Deprecated public BufferedFileChannelInputStream(java.io.File file) throws java.io.IOException
Deprecated.Constructs a new instance for the given File.- Parameters:
file
- The file to stream.- Throws:
java.io.IOException
- If an I/O error occurs
-
BufferedFileChannelInputStream
@Deprecated public BufferedFileChannelInputStream(java.io.File file, int bufferSize) throws java.io.IOException
Deprecated.Constructs a new instance for the given File and buffer size.- Parameters:
file
- The file to stream.bufferSize
- buffer size.- Throws:
java.io.IOException
- If an I/O error occurs
-
BufferedFileChannelInputStream
@Deprecated public BufferedFileChannelInputStream(java.nio.file.Path path) throws java.io.IOException
Deprecated.Constructs a new instance for the given Path.- Parameters:
path
- The path to stream.- Throws:
java.io.IOException
- If an I/O error occurs
-
BufferedFileChannelInputStream
@Deprecated public BufferedFileChannelInputStream(java.nio.file.Path path, int bufferSize) throws java.io.IOException
Deprecated.Constructs a new instance for the given Path and buffer size.- Parameters:
path
- The path to stream.bufferSize
- buffer size.- Throws:
java.io.IOException
- If an I/O error occurs
-
-
Method Detail
-
builder
public static BufferedFileChannelInputStream.Builder builder()
Constructs a newBufferedFileChannelInputStream.Builder
.- Returns:
- a new
BufferedFileChannelInputStream.Builder
. - Since:
- 2.12.0
-
available
public int available() throws java.io.IOException
- Overrides:
available
in classjava.io.InputStream
- Throws:
java.io.IOException
-
clean
private void clean(java.nio.ByteBuffer buffer)
Attempts to clean up a ByteBuffer if it is direct or memory-mapped. This uses an *unsafe* Sun API that will cause errors if one attempts to read from the disposed buffer. However, neither the bytes allocated to direct buffers nor file descriptors opened for memory-mapped buffers put pressure on the garbage collector. Waiting for garbage collection may lead to the depletion of off-heap memory or huge numbers of open files. There's unfortunately no standard API to manually dispose of these kinds of buffers.- Parameters:
buffer
- the buffer to clean.
-
cleanDirectBuffer
private void cleanDirectBuffer(java.nio.ByteBuffer buffer)
In Java 8, the type ofsun.nio.ch.DirectBuffer.cleaner()
wassun.misc.Cleaner
, and it was possible to access the methodsun.misc.Cleaner.clean()
to invoke it. The type changed tojdk.internal.ref.Cleaner
in later JDKs, and theclean()
method is not accessible even with reflection. Howeversun.misc.Unsafe
added aninvokeCleaner()
method in JDK 9+ and this is still accessible with reflection.- Parameters:
buffer
- the buffer to clean. must be a DirectBuffer.
-
close
public void close() throws java.io.IOException
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.InputStream
- Throws:
java.io.IOException
-
read
public int read() throws java.io.IOException
- Specified by:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
read
public int read(byte[] b, int offset, int len) throws java.io.IOException
- Overrides:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
refill
private boolean refill() throws java.io.IOException
Checks whether data is left to be read from the input stream.- Returns:
- true if data is left, false otherwise
- Throws:
java.io.IOException
- if an I/O error occurs.
-
skip
public long skip(long n) throws java.io.IOException
- Overrides:
skip
in classjava.io.InputStream
- Throws:
java.io.IOException
-
skipFromFileChannel
private long skipFromFileChannel(long n) throws java.io.IOException
- Throws:
java.io.IOException
-
-