目录
字段mark,position,limit,capacity,address,构造函数
方法capacity,2个position,2个limit,mark,reset
方法flip,rewind,remaining,hasRemaining,isReadOnly
方法hasArray,array,arrayOffset,isDirect
方法2个nextGetIndex,2个nextPutIndex,2个checkIndex,markValue,truncate,discardMark,checkBounds
简介
package java.nio;
import java.util.Spliterator;
/**
* 存储特定基础类型数据的容器。
*
* <p> 缓冲区是特定基础类型的线性有限序列。
* 除了它的内容外,buffer的基本特性是它的capacity, limit, position:
* </p>
*
* <blockquote>
*
* <p> 缓冲区的capacity是它包含的元素的数量。
* 缓冲区的容量永远不会是负的,也不会改变。
* </p>
*
* <p> 缓冲区的limit是第一个不应该读或写的元素的索引。
* 缓冲区的限制永远不会是负数,也不会大于其容量。
* </p>
*
* <p> 缓冲区的position是下一个要读取或写入的元素的索引。
* 缓冲区的位置永远不会是负数,也不会超过它的limit。
* </p>
*
* </blockquote>
*
* <p> 每个非布尔基础类型都有一个子类。
*
*
* <h2> 传输数据 </h2>
*
* <p> 此类的每个子类都定义了两类get和put操作</p>
*
* <blockquote>
*
* <p>相对操作,读取或写入从当前位置开始的一个或多个元素,然后按传输的元素数增加该位置。
* 如果请求的传输超过limit,则相对的get操作抛出BufferUnderflowException,
* 而相对的put操作抛出BufferOverflowException;无论哪种情况,都不会传输数据。
* </p>
*
* <p> 绝对操作采用显式元素索引,不会影响position。
* 如果index参数超过限制,绝对的get和put操作会抛出IndexOutOfBoundsException。
* </p>
*
* </blockquote>
*
* <p> 当然,也可以通过一个合适的channel的IO操作,
* 将数据传送进或者出,缓存中一个相对于当前position的位置。
*
*
* <h2> 标记和重置 </h2>
*
* <p> 缓冲区的mark是在调用reset方法时其位置将被重置到的索引。
* 标记不是总是被定义的,但是当它被定义时,它就不是负的,也永远不会比position大。
* 如果标记已定义,则当位置或限制调整为小于标记的值时,将丢弃该标记。
* 如果未定义标记,则调用reset方法将引发InvalidMarkException。
*
*
* <h2> 不变式</h2>
*
* <p> 以下不变量适用于mark, position, limit和capacity值:
*
* <blockquote>
* <tt>0</tt> <tt><=</tt>
* <i>mark</i> <tt><=</tt>
* <i>position</i> <tt><=</tt>
* <i>limit</i> <tt><=</tt>
* <i>capacity</i>
* </blockquote>
*
* <p> 新创建的缓冲区总是position为0,mark未定义。
* 初始limit可以是零,也可以是其他值,这取决于缓冲区的类型和它的构造方式。
* 新分配的缓冲区的每个元素初始化为零。
*
*
* <h2> Clearing, flipping, and rewinding </h2>
*
* <p> 除了访问位置、限制和容量值以及标记和重置的方法外,此类还定义了对缓冲区的以下操作:
*
* <ul>
*
* <li><p>clear使缓冲区为新的通道read或相对put操作做好准备:
* 它将limit设置为capacity,position设置为0。
* </p></li>
*
* <li><p> flip使缓冲区为新的通道写入或相对get操作序列做好准备:
* 它将limit设置为当前position,position设置为0。
* </p></li>
*
* <li><p>rewind使缓冲区准备好重新读取已包含的数据:
* 它保持limit不变,position设置为0。
* </p></li>
*
* </ul>
*
*
* <h2> 只读缓冲区 </h2>
*
* <p> 每个缓冲区都是可读的,但不是每个缓冲区都是可写的。
* 每个buffer类的改变内容的方法被指定为可选操作,当对只读缓冲区进行调用时,将抛出ReadOnlyBufferException。
* 只读缓冲区不允许更改其内容,但其标记、位置和限制值是可变的。
* 是否缓冲区是否为只读可以通过调用其isReadOnly方法来确定。
*
*
* <h2> 线程安全 </h2>
*
* <p> 多个并发线程使用缓冲区不安全。
* 如果缓冲将由多个线程使用,那么应该通过适当的同步来控制对缓冲区的访问。
*
*
* <h2> 调用链 </h2>
*
* <p> 类中没有返回值的方法被指定为返回调用它们的缓冲区。
* 这允许链接方法调用;例如
*
* <blockquote><pre>
* b.flip();
* b.position(23);
* b.limit(42);</pre></blockquote>
*
* 可以用一个更紧凑的语句代替
*
* <blockquote><pre>
* b.flip().position(23).limit(42);</pre></blockquote>
*
*
* @author Mark Reinhold
* @author JSR-51 Expert Group
* @since 1.4
*/
public abstract class Buffer
<