Skip to content

ByteBuffer 流

小马哥 edited this page Jun 21, 2016 · 9 revisions

概述

Java NIO 中提供了一个可以进行高效 IO 操作 ByteBuffer 类,但是 ByteBuffer 在使用上有一点不便,就是分配的空间大小是确定的。这就像数组,而不能像 List 一样自动扩容。Java 还提供了可以自动扩容的输入输出字节数组流(ByteArrayInputStream 和 ByteArrayOutputStream),但是它们底层是用数组实现的,而不能直接操作 ByteBuffer。

为了更方便的操作 ByteBuffer,Hprose 提供了基于 ByteBuffer 的输入输出流,可以在 ByteBuffer 上进行流式操作。这部分包括了三个类:

  • ByteBufferStream
  • ByteBufferInputStream
  • ByteBufferOutputStream

其中 ByteBufferStream 类是这部分的核心,它包含了输入输出流的实现。ByteBufferInputStream 是对 ByteBufferStream 的一个 InputSteam 包装。ByteBufferOutputStream 是对 ByteBufferStream 的一个 OutputSteam 包装。

下面重点介绍 ByteBufferStream 类。

ByteBufferStream 类

ByteBufferStream 构造器

public ByteBufferStream();
public ByteBufferStream(int capacity);
public ByteBufferStream(ByteBuffer buffer);

无参构造器创建一个容量大小为 1024 的 ByteBufferStream 对象。包含 capacity 参数的构造器创建一个容量大小为 capacityByteBufferStream 对象。通常,这两种构造器创建的 ByteBufferStream 对象用于写数据。包含 buffer 参数的构造器创建一个以 buffer 为底层操作对象的 ByteBufferStream 对象,通常,该构造器创建的 ByteBufferStream 对象用于读数据。

静态方法

allocate 方法

public final static ByteBuffer allocate(int capacity);

分配一个容量大小为 capacity 的直接内存的 ByteBuffer 对象。该方法功能 ByteBuffer.allocateDirect 类似,但是它会优先使用 ByteBufferStream 内存池中的已分配的空闲对象作为返回结果。

free 方法

public final static void free(ByteBuffer buffer);

ByteBuffer 对象放入 ByteBufferStream 内存池,这里的 buffer 应该是在直接内存上分配的 ByteBuffer 对象,并且容量不小于 1024 且为 2 的 n 次方,否则将直接释放。

wrap 方法

public final static ByteBufferStream wrap(byte[] array, int offset, int length);
public final static ByteBufferStream wrap(byte[] array);

将字节数组 array 包装为一个 ByteBufferStream 对象并返回。

实例方法

close 方法

关闭并回收该对象所包含的 ByteBuffer 对象。

getInputStream 方法

返回该对象的 InputStream 包装。

getOutputStream 方法

返回该对象的 OutputStream 包装。

read 方法

public final int read();
public final int read(byte b[]);
public final int read(byte b[], int off, int len);
public final int read(ByteBuffer b);

无参的 read 方法读取一个字节并返回。

其它三种形式将结果读入到 b 中,并返回读入长度。

如果已经读到结尾,则返回 -1。

skip 方法

public final long skip(long n);

针对读取操作,略过长度为 n 的字节。

available 方法

public final int available();

返回还可以读取的字节数。

markSupported 方法

永远返回 true,表示是否支持 mark 操作。

mark 方法

public final void mark(int readlimit);

标记当前流的读取位置。该位置可以通过 reset 方法恢复。 readlimit 参数仅为兼容 InputStream,本方法在实际执行时,忽略该参数。

reset 方法

恢复 mark 方法标记的位置。

Clone this wiki locally