Class SeekableInMemoryByteChannel

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.nio.channels.ByteChannel, java.nio.channels.Channel, java.nio.channels.ReadableByteChannel, java.nio.channels.SeekableByteChannel, java.nio.channels.WritableByteChannel

    public class SeekableInMemoryByteChannel
    extends java.lang.Object
    implements java.nio.channels.SeekableByteChannel
    A SeekableByteChannel implementation that wraps a byte[].

    When this channel is used for writing an internal buffer grows to accommodate incoming data. The natural size limit is the value of Integer.MAX_VALUE and it is not possible to set the position or truncate to a value bigger than that. Internal buffer can be accessed via array().

    Since:
    1.13
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.util.concurrent.atomic.AtomicBoolean closed  
      private byte[] data  
      private static int NAIVE_RESIZE_LIMIT  
      private int position  
      private int size  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      byte[] array()
      Obtains the array backing this channel.
      void close()  
      private void ensureOpen()  
      boolean isOpen()  
      long position()
      Returns this channel's position.
      java.nio.channels.SeekableByteChannel position​(long newPosition)  
      int read​(java.nio.ByteBuffer buf)  
      private void resize​(int newLength)  
      long size()
      Returns the current size of entity to which this channel is connected.
      java.nio.channels.SeekableByteChannel truncate​(long newSize)
      Truncates the entity, to which this channel is connected, to the given size.
      int write​(java.nio.ByteBuffer b)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • data

        private byte[] data
      • closed

        private final java.util.concurrent.atomic.AtomicBoolean closed
      • position

        private int position
      • size

        private int size
    • Constructor Detail

      • SeekableInMemoryByteChannel

        public SeekableInMemoryByteChannel()
        Parameterless constructor - allocates internal buffer by itself.
      • SeekableInMemoryByteChannel

        public SeekableInMemoryByteChannel​(byte[] data)
        Constructor taking a byte array.

        This constructor is intended to be used with pre-allocated buffer or when reading from a given byte array.

        Parameters:
        data - input data or pre-allocated array.
      • SeekableInMemoryByteChannel

        public SeekableInMemoryByteChannel​(int size)
        Constructor taking a size of storage to be allocated.

        Creates a channel and allocates internal storage of a given size.

        Parameters:
        size - size of internal buffer to allocate, in bytes.
    • Method Detail

      • array

        public byte[] array()
        Obtains the array backing this channel.

        NOTE: The returned buffer is not aligned with containing data, use size() to obtain the size of data stored in the buffer.

        Returns:
        internal byte array.
      • close

        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.nio.channels.Channel
        Specified by:
        close in interface java.io.Closeable
      • ensureOpen

        private void ensureOpen()
                         throws java.nio.channels.ClosedChannelException
        Throws:
        java.nio.channels.ClosedChannelException
      • isOpen

        public boolean isOpen()
        Specified by:
        isOpen in interface java.nio.channels.Channel
      • position

        public long position()
        Returns this channel's position.

        This method violates the contract of SeekableByteChannel.position() as it will not throw any exception when invoked on a closed channel. Instead it will return the position the channel had when close has been called.

        Specified by:
        position in interface java.nio.channels.SeekableByteChannel
      • position

        public java.nio.channels.SeekableByteChannel position​(long newPosition)
                                                       throws java.io.IOException
        Specified by:
        position in interface java.nio.channels.SeekableByteChannel
        Throws:
        java.io.IOException
      • read

        public int read​(java.nio.ByteBuffer buf)
                 throws java.io.IOException
        Specified by:
        read in interface java.nio.channels.ReadableByteChannel
        Specified by:
        read in interface java.nio.channels.SeekableByteChannel
        Throws:
        java.io.IOException
      • resize

        private void resize​(int newLength)
      • size

        public long size()
        Returns the current size of entity to which this channel is connected.

        This method violates the contract of SeekableByteChannel.size() as it will not throw any exception when invoked on a closed channel. Instead it will return the size the channel had when close has been called.

        Specified by:
        size in interface java.nio.channels.SeekableByteChannel
      • truncate

        public java.nio.channels.SeekableByteChannel truncate​(long newSize)
        Truncates the entity, to which this channel is connected, to the given size.

        This method violates the contract of SeekableByteChannel.truncate(long) as it will not throw any exception when invoked on a closed channel.

        Specified by:
        truncate in interface java.nio.channels.SeekableByteChannel
        Throws:
        java.lang.IllegalArgumentException - if size is negative or bigger than the maximum of a Java integer
      • write

        public int write​(java.nio.ByteBuffer b)
                  throws java.io.IOException
        Specified by:
        write in interface java.nio.channels.SeekableByteChannel
        Specified by:
        write in interface java.nio.channels.WritableByteChannel
        Throws:
        java.io.IOException