zoukankan      html  css  js  c++  java
  • java.nio.Buffer

    JAVADOC: java.nio.Buffer

    一个用于特定基本类型数据的容器。

    缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置:

    缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

    缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

    缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

    对于每个非 boolean 基本类型,此类都有一个子类与之对应。

    传输数据
    此类的每个子类都定义了两种获取 和放置 操作:

    相对 操作读取或写入一个或多个元素,它从当前位置开始,然后将位置增加所传输的元素数。如果请求的传输超出限制,则相对获取 操作将抛出 BufferUnderflowException,相对放置 操作将抛出 BufferOverflowException;这两种情况下,都没有数据被传输。

    绝对 操作采用显式元素索引,该操作不影响位置。如果索引参数超出限制,绝对获取 操作和放置 操作将抛出 IndexOutOfBoundsException。

    当然,通过适当通道的 I/O 操作(通常与当前位置有关)也可以将数据传输到缓冲区或从缓冲区传出数据。

    做标记和重置
    缓冲区的标记 是一个索引,在调用 reset 方法时会将缓冲区的位置重置为该索引。并非总是需要定义标记,但在定义标记时,不能将其定义为负数,并且不能让它大于位置。如果定义了标记,则在将位置或限制调整为小于该标记的值时,该标记将被丢弃。如果未定义标记,那么调用 reset 方法将导致抛出 InvalidMarkException。

    不变式
    标记、位置、限制和容量值遵守以下不变式:

    0 <= 标记 <= 位置 <= 限制 <= 容量
    新创建的缓冲区总有一个 0 位置和一个未定义的标记。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容是未定义的。

    清除、反转和重绕
    除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:

    clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

    flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。

    rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。

    只读缓冲区
    每个缓冲区都是可读取的,但并非每个缓冲区都是可写入的。每个缓冲区类的转变方法都被指定为可选操作,当对只读缓冲区调用时,将抛出 ReadOnlyBufferException。只读缓冲区不允许更改其内容,但其标记、位置和限制值是可变的。可以调用其 isReadOnly 方法确定缓冲区是否为只读。

    线程安全
    多个当前线程使用缓冲区是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。

    调用链
    指定此类中的方法返回调用它们的缓冲区(否则它们不会返回任何值)。此操作允许将方法调用组成一个链;例如,语句序列

    b.flip();
    b.position(23);
    b.limit(42);
    可以由以下更紧凑的一个语句代替
    b.flip().position(23).limit(42);


    从以下版本开始:
    1.4

    --------------------------------------------------------------------------------

    按以下例子:

            ByteBuffer bb = ByteBuffer.allocate(10);
            for(int i = 0; i < 9; i++) {
                bb.put((byte)i);
            }
            System.out.println("pos: " + bb.position());
            System.out.println("limit: " + bb.limit());
            System.out.println("cap: " + bb.capacity());
            System.out.println("mark: " + bb.mark());
            
            bb.flip(); // bb.limit(bb.position()).position(0);
            System.out.println("---------------");
            System.out.println("pos: " + bb.position());
            System.out.println("limit: " + bb.limit());
            System.out.println("cap: " + bb.capacity());
            System.out.println("mark: " + bb.mark());
            
            bb.mark(); // bb.mark(bb.position()).position(0);
            System.out.println("---------------");
            System.out.println("pos: " + bb.position());
            System.out.println("limit: " + bb.limit());
            System.out.println("cap: " + bb.capacity());
            System.out.println("mark: " + bb.mark());
            
            bb.clear(); // bb.position(0).limit(10);
            System.out.println("---------------");
            System.out.println("pos: " + bb.position());
            System.out.println("limit: " + bb.limit());
            System.out.println("cap: " + bb.capacity());
            System.out.println("mark: " + bb.mark());
    
            System.out.println("---------------");
            bb.limit();
            System.out.println("mark: " + bb.mark());
            bb.limit(1);
            System.out.println("mark: " + bb.mark());
            bb.put((byte)9);
            System.out.println("mark: " + bb.mark());
            bb.put((byte)10);

    将输出:

    pos: 9
    limit: 10
    cap: 10
    mark: java.nio.HeapByteBuffer[pos=9 lim=10 cap=10]
    ---------------
    pos: 0
    limit: 9
    cap: 10
    mark: java.nio.HeapByteBuffer[pos=0 lim=9 cap=10]
    ---------------
    pos: 0
    limit: 9
    cap: 10
    mark: java.nio.HeapByteBuffer[pos=0 lim=9 cap=10]
    ---------------
    pos: 0
    limit: 10
    cap: 10
    mark: java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]
    ---------------
    mark: java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]
    mark: java.nio.HeapByteBuffer[pos=0 lim=1 cap=10]
    mark: java.nio.HeapByteBuffer[pos=1 lim=1 cap=10]
    Exception in thread "main" java.nio.BufferOverflowException
        at java.nio.Buffer.nextPutIndex(Buffer.java:495)
        at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:145)
        at com.garinzhang.lab.mina.demo4.IoBufferTest.main(IoBufferTest.java:49)

    References:

    http://www.blogjava.net/killme2008/archive/2008/02/22/181357.html

    http://blog.csdn.net/sinboy/article/details/3984459

    http://www.cnblogs.com/killbug/archive/2012/11/25/2787717.html

    http://www.cnblogs.com/rollenholt/archive/2011/09/29/2195730.html

    路慢慢其休远羲,吾将上下而求所
  • 相关阅读:
    pyinstall打包工具
    python中用xlsxwriter创建图表
    python打包工具 cx_Freeze介绍
    JavaScript、Dom和jQuery
    MHA原理
    mysql-mmm实现高可用和部署时须要考虑的问题
    jquery中attr和prop的区别
    FLUSH TABLES WITH READ LOCK 获取锁的速度
    Python Memcached、Redis & RabbitMQ使用
    innodb_flush_log_at_trx_commit
  • 原文地址:https://www.cnblogs.com/garinzhang/p/2938311.html
Copyright © 2011-2022 走看看