Class MemoryMappedFileInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable

    public final class MemoryMappedFileInputStream
    extends java.io.InputStream
    An InputStream that utilizes memory mapped files to improve performance. A sliding window of the file is mapped to memory to avoid mapping the entire file to memory at one time. The size of the sliding buffer is configurable.

    For most operating systems, mapping a file into memory is more expensive than reading or writing a few tens of kilobytes of data. From the standpoint of performance. it is generally only worth mapping relatively large files into memory.

    Note: Use of this class does not necessarily obviate the need to use a BufferedInputStream. Depending on the use case, the use of buffering may still further improve performance. For example:

    To build an instance, see MemoryMappedFileInputStream.Builder.

    
     BufferedInputStream s = new BufferedInputStream(new GzipInputStream(
       MemoryMappedFileInputStream.builder()
         .setPath(path)
         .setBufferSize(256 * 1024)
         .get()));
     

    should outperform:

     new GzipInputStream(new MemoryMappedFileInputStream(path))
     
    
     GzipInputStream s = new GzipInputStream(
       MemoryMappedFileInputStream.builder()
         .setPath(path)
         .setBufferSize(256 * 1024)
         .get());
     
    Since:
    2.12.0
    • Field Detail

      • DEFAULT_BUFFER_SIZE

        private static final int DEFAULT_BUFFER_SIZE
        Default size of the sliding memory mapped buffer. We use 256K, equal to 65536 pages (given a 4K page size). Increasing the value beyond the default size will generally not provide any increase in throughput.
        See Also:
        Constant Field Values
      • EMPTY_BUFFER

        private static final java.nio.ByteBuffer EMPTY_BUFFER
      • bufferSize

        private final int bufferSize
      • channel

        private final java.nio.channels.FileChannel channel
      • buffer

        private java.nio.ByteBuffer buffer
      • closed

        private boolean closed
      • nextBufferPosition

        private long nextBufferPosition
        The starting position (within the file) of the next sliding buffer.
    • Constructor Detail

      • MemoryMappedFileInputStream

        private MemoryMappedFileInputStream​(java.nio.file.Path file,
                                            int bufferSize)
                                     throws java.io.IOException
        Constructs a new instance.
        Parameters:
        file - The path of the file to open.
        bufferSize - Size of the sliding buffer.
        Throws:
        java.io.IOException - If an I/O error occurs.
    • Method Detail

      • available

        public int available()
                      throws java.io.IOException
        Overrides:
        available in class java.io.InputStream
        Throws:
        java.io.IOException
      • cleanBuffer

        private void cleanBuffer()
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.InputStream
        Throws:
        java.io.IOException
      • ensureOpen

        private void ensureOpen()
                         throws java.io.IOException
        Throws:
        java.io.IOException
      • getBufferSize

        int getBufferSize()
      • nextBuffer

        private void nextBuffer()
                         throws java.io.IOException
        Throws:
        java.io.IOException
      • read

        public int read()
                 throws java.io.IOException
        Specified by:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • read

        public int read​(byte[] b,
                        int off,
                        int len)
                 throws java.io.IOException
        Overrides:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • skip

        public long skip​(long n)
                  throws java.io.IOException
        Overrides:
        skip in class java.io.InputStream
        Throws:
        java.io.IOException