java nio Buffer源码分析

本文详细分析了Java NIO Buffer的源码,包括其核心字段mark、position、limit、capacity、address以及构造函数。同时,探讨了Buffer的主要方法,如capacity、position的调整、limit的设定、mark和reset操作,以及flip、rewind、remaining等方法的工作原理,帮助读者全面掌握Java NIO Buffer的使用和内部机制。
摘要由CSDN通过智能技术生成

目录

简介

字段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>&lt;=</tt>
 *     <i>mark</i> <tt>&lt;=</tt>
 *     <i>position</i> <tt>&lt;=</tt>
 *     <i>limit</i> <tt>&lt;=</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

<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值