All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tangosol.io.ReadBuffer Maven / Gradle / Ivy

There is a newer version: 24.09
Show newest version
/*
 * Copyright (c) 2000, 2021, Oracle and/or its affiliates.
 *
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * http://oss.oracle.com/licenses/upl.
 */

package com.tangosol.io;


import com.tangosol.util.ExternalizableHelper;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;

import java.nio.ByteBuffer;

import com.tangosol.util.Binary;
import com.tangosol.util.ByteSequence;


/**
* The ReadBuffer interface represents an in-memory block of binary data,
* such as that represented by a byte[], a Binary object, or an NIO buffer.
*
* @author cp  2005.01.18
*/
public interface ReadBuffer
        extends ByteSequence, Cloneable
    {
    /**
    * Determine the length of the buffer.
    *
    * @return the number of bytes of data represented by this ReadBuffer
    */
    public int length();

    /**
    * Returns the byte at the specified offset. An offset ranges
    * from 0 to length() - 1. The first byte
    * of the sequence is at offset 0, the next at offset
    * 1, and so on, as for array indexing.
    *
    * @param of  the offset (index) of the byte
    *
    * @return the byte at the specified offset in this ReadBuffer
    *
    * @exception  IndexOutOfBoundsException  if the of
    *             argument is negative or not less than the length of this
    *             ReadBuffer
    */
    public byte byteAt(int of);

    /**
    * Copies bytes from this ReadBuffer into the destination byte array.
    * 

* The first byte to be copied is at offset ofBegin; * the last byte to be copied is at offset ofEnd-1 * (thus the total number of bytes to be copied is ofEnd - * ofBegin). The bytes are copied into the sub-array of * abDest starting at offset ofDest * and ending at index: *

    *     ofDest + (ofEnd - ofBegin) - 1
    * 
*

* This method is the ReadBuffer equivalent of * {@link String#getChars(int, int, char[], int)}. It allows the caller * to extract a chunk of bytes into the caller's own array. * * @param ofBegin offset of the first byte in the ReadBuffer to copy * @param ofEnd offset after the last byte in the ReadBuffer to copy * @param abDest the destination byte array * @param ofDest the offset in the destination byte array to copy the * first byte to * * @exception IndexOutOfBoundsException Thrown if any of the following * is true: *

    *
  • ofBegin is negative; *
  • ofBegin is greater than ofEnd *
  • ofEnd is greater than the length of this * ReadBuffer; *
  • ofDest is negative *
  • ofDest + (ofEnd - ofBegin) is larger than * abDest.length *
* @exception NullPointerException if abDest is * null */ public void copyBytes(int ofBegin, int ofEnd, byte abDest[], int ofDest); /** * Get a BufferInput object to read data from this buffer. Note that each * call to this method will return a new BufferInput object, with the * possible exception being that a zero-length ReadBuffer could always * return the same instance (since there is nothing to read). * * @return a BufferInput that is reading from this buffer starting at * offset zero */ public BufferInput getBufferInput(); /** * Obtain a ReadBuffer for a portion of this ReadBuffer. * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the resulting ReadBuffer * * @return a ReadBuffer that represents a portion of this ReadBuffer * * @exception IndexOutOfBoundsException if of or * cb is negative, or of + cb is * larger than the length of this ReadBuffer * object */ public ReadBuffer getReadBuffer(int of, int cb); /** * Write the contents of this ReadBuffer to an OutputStream. * * @param out an OutputStream to write to * * @throws IOException if an I/O exception occurs */ public void writeTo(OutputStream out) throws IOException; /** * Write the contents of the ReadBuffer to an OutputStream. * * @param out an OutputStream to write to * @param of the beginning index, inclusive * @param cb the number of bytes to write to an OutputStream * * @throws IOException if an I/O exception occurs */ public void writeTo(OutputStream out, int of, int cb) throws IOException; /** * Write the contents of this ReadBuffer to a DataOutput. * * @param out a DataOutput to write to * * @throws IOException if an I/O exception occurs */ public void writeTo(DataOutput out) throws IOException; /** * Write the contents of this ReadBuffer to a DataOutput. * * @param out a DataOutput to write to * @param of the beginning index, inclusive * @param cb the number of bytes to write to a DataOutput * * @throws IOException if an I/O exception occurs */ public void writeTo(DataOutput out, int of, int cb) throws IOException; /** * Write the contents of the Binary object to a ByteBuffer. * * @param buf a ByteBuffer to write to */ public void writeTo(ByteBuffer buf); /** * Write the contents of the Binary object to a ByteBuffer. * * @param buf an ByteBuffer to write to * @param of the beginning index, inclusive * @param cb the number of bytes to write to a ByteBuffer * * @throws IOException if an I/O exception occurs */ public void writeTo(ByteBuffer buf, int of, int cb) throws IOException; /** * Get the contents of the ReadBuffer as a byte array. *

* This is the equivalent of toByteArray(0, length()). * * @return a byte[] with the contents of this ReadBuffer object */ public byte[] toByteArray(); /** * Get a portion of the contents of the ReadBuffer as a byte array. *

* This method is an equivalent of * getReadBuffer(of, cb).toByteArray(). * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the resulting byte[] * * @return a byte[] containing the specified portion of this ReadBuffer * * @exception IndexOutOfBoundsException if of or * cb is negative, or of + cb is * larger than the length of this ReadBuffer * object */ public byte[] toByteArray(int of, int cb); /** * Return a new Binary object that holds the complete contents of this * ReadBuffer. *

* This is the equivalent of toBinary(0, length()). * * @return the contents of this ReadBuffer as a Binary object */ public Binary toBinary(); /** * Return a Binary object that holds the specified portion of this * ReadBuffer. *

* This method is an equivalent of * getReadBuffer(of, cb).toBinary(). * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the Binary object * * @return a Binary object containing the specified portion of this * ReadBuffer * * @exception IndexOutOfBoundsException if of or * cb is negative, or of + cb is * larger than the length of this ReadBuffer * object */ public Binary toBinary(int of, int cb); /** * Return a read-only ByteBuffer view of this ReadBuffer. This view may or * may not reflect any subsequent changes made to the underlying content. * * @return a read-only ByteBuffer view of this ReadBuffer * * @since Coherence 12.1.2 */ public ByteBuffer toByteBuffer(); /** * Return a read-only ByteBuffer view of the specified portion of this * ReadBuffer. This view may or may not reflect any subsequent changes made * to the underlying content. *

* This method is an equivalent of * getReadBuffer(of, cb).toByteBuffer(). * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the ByteBuffer object * * @return a read-only ByteBuffer view of the specified portion of this * ReadBuffer * * @exception IndexOutOfBoundsException if of or * cb is negative, or of + cb is * larger than the length of this ReadBuffer object * * @since Coherence 12.1.2 */ public ByteBuffer toByteBuffer(int of, int cb); /** * {@inheritDoc} * * @since Coherence 3.7 */ public ByteSequence subSequence(int ofStart, int ofEnd); // ----- Object methods ------------------------------------------------- /** * Compare two ReadBuffer objects for equality. * * @param o a ReadBuffer object * * @return true iff the other ReadBuffer is identical to this */ public boolean equals(Object o); /** * Create a clone of this ReadBuffer object. * * @return a ReadBuffer object with the same contents as this * ReadBuffer object */ public Object clone(); // ----- inner interface: BufferInput ----------------------------------- /** * The BufferInput interface represents a DataInputStream on top of a * ReadBuffer. * * @author cp 2005.01.18 */ public interface BufferInput extends InputStreaming, DataInput { // ----- InputStreaming methods --------------------------------- /** * Returns the number of bytes that can be read (or skipped over) from * this input stream without causing a blocking I/O condition to * occur. This method reflects the assumed implementation of various * buffering InputStreams, which can guarantee non-blocking reads up * to the extent of their buffers, but beyond that the read operations * will have to read from some underlying (and potentially blocking) * source. *

* BufferInput implementations must implement this method to return * the extent of the buffer that has not yet been read; in other * words, the entire un-read portion of the buffer must be * available. * * @return the number of bytes that can be read from this InputStream * without blocking * * @exception IOException if an I/O error occurs */ public int available() throws IOException; /** * Close the InputStream and release any system resources associated * with it. *

* BufferInput implementations do not pass this call down onto an * underlying stream, if any. * * @exception IOException if an I/O error occurs */ public void close() throws IOException; /** * Marks the current read position in the InputStream in order to * support the stream to be later "rewound" (using the {@link #reset} * method) to the current position. The caller passes in the maximum * number of bytes that it expects to read before calling the * {@link #reset} method, thus indicating the upper bounds of the * responsibility of the stream to be able to buffer what it has read * in order to support this functionality. *

* BufferInput implementations ignore the cbReadLimit; * they must support an unlimited read limit, since they appear to the * user as an input stream on top of a fully realized read buffer. * * @param cbReadLimit the maximum number of bytes that caller expects * the InputStream to be able to read before the * mark position becomes invalid */ public void mark(int cbReadLimit); /** * Determine if this InputStream supports the {@link #mark} and * {@link #reset} methods. *

* BufferInput implementations must support the {@link #mark} * and {@link #reset} methods, so this method always returns * true. * * @return true if this InputStream supports the mark * and reset method; false otherwise */ public boolean markSupported(); // ----- DataInput methods -------------------------------------- /** * Read ab.length bytes and store them in * ab. *

* This method blocks until input data is available, the end of the * stream is detected, or an exception is thrown. * * @param ab the array to store the bytes which are read from the * stream * * @exception NullPointerException if the passed array is null * @exception java.io.EOFException if the stream is exhausted before the * number * of bytes indicated by the array length could be read * @exception IOException if an I/O error occurs */ public void readFully(byte ab[]) throws IOException; /** * Read cb bytes and store them in ab * starting at offset of. *

* This method blocks until input data is available, the end of the * stream is detected, or an exception is thrown. * * @param ab the array to store the bytes which are read from the * stream * @param of the offset into the array that the read bytes will be * stored * @param cb the maximum number of bytes to read * * @exception NullPointerException if the passed array is null * @exception IndexOutOfBoundsException if of or * cb is negative, or of+cb is * greater than the length of the ab * @exception java.io.EOFException if the stream is exhausted before the * number of bytes indicated by the array length could be * read * @exception IOException if an I/O error occurs */ public void readFully(byte ab[], int of, int cb) throws IOException; /** * Skips over up to the specified number of bytes of data. The number * of bytes actually skipped over may be fewer than the number * specified to skip, and may even be zero; this can be caused by an * end-of-file condition, but can also occur even when there is data * remaining to be read. As a result, the caller should check the * return value from this method, which indicates the actual number of * bytes skipped. * * @param cb the maximum number of bytes to skip over * * @return the actual number of bytes that were skipped over * * @exception IOException if an I/O error occurs */ public int skipBytes(int cb) throws IOException; /** * Read a boolean value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeBoolean} method. * * @return either true or false * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public boolean readBoolean() throws IOException; /** * Read a byte value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeByte} method. * * @return a byte value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public byte readByte() throws IOException; /** * Read an unsigned byte value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeByte} method when it is used with * unsigned 8-bit values. * * @return an int value in the range 0x00 to 0xFF * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readUnsignedByte() throws IOException; /** * Read a short value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeShort} method. * * @return a short value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public short readShort() throws IOException; /** * Read an unsigned short value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeShort} method when it is used with * unsigned 16-bit values. * * @return an int value in the range of 0x0000 to 0xFFFF * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readUnsignedShort() throws IOException; /** * Read a char value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeChar} method. * * @return a char value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public char readChar() throws IOException; /** * Read an int value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeInt} method. * * @return an int value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readInt() throws IOException; /** * Read a long value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeLong} method. * * @return a long value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public long readLong() throws IOException; /** * Read a float value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeFloat} method. * * @return a float value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public float readFloat() throws IOException; /** * Read a double value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeDouble} method. * * @return a double value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public double readDouble() throws IOException; /** * Reads the next "line" of text. *

* This method does not have a counterpart in the * {@link java.io.DataOutput} interface. Furthermore, this method is * defined as operating on bytes and not on characters, and thus it * should be selected for use only after careful consideration, as if * it were deprecated (which it has been in java.io.DataInputStream). * * @return a line of text as a String * @exception IOException if an I/O error occurs. */ public String readLine() throws IOException; /** * Reads a String value. *

* This method is the counterpart for the * {@link java.io.DataOutput#writeUTF} method. * * @return a String value * * @exception java.io.UTFDataFormatException if the bytes that were * read were not * a valid UTF-8 encoded string * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public String readUTF() throws IOException; // ----- BufferInput methods ------------------------------------ /** * Get the ReadBuffer object that this BufferInput is reading from. * * @return the underlying ReadBuffer object */ public ReadBuffer getBuffer(); /** * Read a variable-length encoded UTF packed String. The major * differences between this implementation and DataInput is that this * supports null String values and is not limited to 64KB UTF-encoded * values. * * @return a String value; may be null * * @exception IOException if an I/O error occurs */ public String readSafeUTF() throws IOException; /** * Read an int value using a variable-length storage format as described * by {@link WriteBuffer.BufferOutput#writePackedInt(int)}. * * @return an int value * * @exception IOException if an I/O error occurs */ public int readPackedInt() throws IOException; /** * Read a long value using a variable-length storage format as described * by {@link WriteBuffer.BufferOutput#writePackedLong(long)}. * * @return a long value * * @exception IOException if an I/O error occurs */ public long readPackedLong() throws IOException; /** * Read cb bytes and return them as a ReadBuffer object. * * @param cb the number of bytes to read * * @return a ReadBuffer object composed of cb bytes read * from the BufferInput * * @exception EOFException if the stream is exhausted before * the number of bytes indicated could be read * @exception IOException if an I/O error occurs */ public ReadBuffer readBuffer(int cb) throws IOException; /** * Determine the current offset of this BufferInput within the * underlying ReadBuffer. * * @return the offset of the next byte to read from the ReadBuffer */ public int getOffset(); /** * Specify the offset of the next byte to read from the underlying * ReadBuffer. * * @param of the offset of the next byte to read from the ReadBuffer * * @exception IndexOutOfBoundsException if of < 0 or * of > getBuffer().length() */ public void setOffset(int of); /** * Returns an ObjectInputFilter (or null) that should be used by the caller * to confirm / deny deserialization of a class encoded in this input stream. *

* Note: the return type is agnostic of the ObjectInputFilter to support various JDK versions. * * @return null or an ObjectInputFilter that will permit (or not) the constructor * of a class encoded in this stream. * * @see #setObjectInputFilter(Object) */ public default Object getObjectInputFilter() { return null; } /** * Set the {@link #getObjectInputFilter() ObjectInputFilter} for this stream. *

* The filter's checkInput method is expected to be called for each class * and reference deserialized in the stream. * * @implSpec * This method can set the ObjectInputFilter once. *

* In Java version 17 and greater, the stream's ObjectInputFilter is set * to the filter returned by invoking the * {@link ExternalizableHelper#getConfigSerialFilterFactory() JVM-wide filter factory} * with the {@link #getObjectInputFilter()} current filter} and the{@code filter} parameter. * *

* It is not permitted to replace a {@code non-null} filter with a * {@code null} filter. * If the {@linkplain #getObjectInputFilter() current filter} is {@code non-null}, * the value returned from the filter factory (or provided filter) must * be {@code non-null}. * * @param oInputFilter an ObjectInputFilter instance as an Object to enable * running with Java version 8 or higher, may be null * * @throws IllegalStateException if the filter factory returns {@code null} * when the {@linkplain #getObjectInputFilter() current filter} is * non-null, or if the filter has already been set. */ public default void setObjectInputFilter(Object oInputFilter) { // no-op } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy