`
prowl
  • 浏览: 80677 次
  • 性别: Icon_minigender_1
  • 来自: 艾泽拉斯
社区版块
存档分类
最新评论

ByteBuffer三个常见方法小结 filp(),rewind(),clear()

    博客分类:
  • j2se
 
阅读更多
关于缓冲器ByteBuffer的三个方法:flip(),clear(),remind()。

一、flip():反转此缓冲区,将限制设置为当前位置,然后将位置设置为 0 !

之前的写操作会不断更新当前位置,当写操作完成之后,需调用此方法,将限制位置设置为当前位置,将当前位置设置为0,这样下一个读操作会从0开始,直到限制位置。


   /**
     * Flips this buffer.  The limit is set to the current position and then
     * the position is set to zero.  If the mark is defined then it is
     * discarded.
     *
     * <p> This method is often used in conjunction with the {@link
     * java.nio.ByteBuffer#compact compact} method when transferring data from
     * one place to another.  </p>
     *
     * @return  This buffer
     */
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }


    public byte get() {
        return hb[ix(nextGetIndex())];
    }

    final int nextGetIndex() {	// package-private
        if (position >= limit)
            throw new BufferUnderflowException();
        return position++;
    }


二、remain():与flip不同的是,不会修改限制位置。

比如初始化时:
ByteBuffer buffer=ByteBuffer.allocate(1024);


那么做读操作的时候就会读到第(1024-1)个索引,而flip却不一定能读到(1024-1)个索引,这取决于他的写操作的数据长度。

    /**
     * Rewinds this buffer.  The position is set to zero and the mark is
     * discarded.
     *
     * <p> Invoke this method before a sequence of channel-write or <i>get</i>
     * operations, assuming that the limit has already been set
     * appropriately.  For example:
     *
     * <blockquote><pre>
     * out.write(buf);    // Write remaining data
     * buf.rewind();      // Rewind buffer
     * buf.get(array);    // Copy data into array</pre></blockquote>
     *
     * @return  This buffer
     */
    public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }


三、clear():“清除”此缓冲区,将位置设置为 0,将限制设置为容量!此方法不能实际清除缓冲区中的数据,但从名称来看它似乎能够这样做,这样命名是因为它多数情况下确实是在清除数据时使用。因为调用该方法后,我们一般都会调用FileChannel.read(buff)或者buff.put()来把新的数据放到buff中,此时原来的内容就会被新的内容所覆盖!也不是全部覆盖,而是覆盖掉新数据所包含的字节数!所以看起来好象就是原来的内容被删除一样!

    /**
     * Clears this buffer.  The position is set to zero, the limit is set to
     * the capacity, and the mark is discarded.
     *
     * <p> Invoke this method before using a sequence of channel-read or
     * <i>put</i> operations to fill this buffer.  For example:
     *
     * <blockquote><pre>
     * buf.clear();     // Prepare buffer for reading
     * in.read(buf);    // Read data</pre></blockquote>
     *
     * <p> This method does not actually erase the data in the buffer, but it
     * is named as if it did because it will most often be used in situations
     * in which that might as well be the case. </p>
     *
     * @return  This buffer
     */
    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }


四、ByteBuffer类中提供position(),remaining(),hasRemaining(),limit()等方法来验证以上三点。

五、上述代码中提到的:

and the mark is discarded.


参照mark(),reset()方法。


分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    三、ByteBuffer的主要方法 1. **put()和get()**:用于向缓冲区写入和读取字节。例如,`put(byte b)`写入一个字节,`get()`读取一个字节。 2. **put()和get()的变种**:还有其他版本的put和get方法,如putInt()、...

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    ByteBuffer.zip

    在IT行业中,ByteBuffer是一个非常重要的概念,特别是在网络通信和数据处理领域。ByteBuffer是Java平台提供的一种高效的数据操作接口,它允许我们以字节为单位进行读写操作,这对于处理二进制数据尤其有用。在...

    Android在JNI中使用ByteBuffer的方法

    在JNI中与ByteBuffer交互,需要使用以下三个JNI函数: 1. `NewDirectByteBuffer(void* address, jlong capacity)`:根据给定的内存地址和容量创建一个直接ByteBuffer。 2. `GetDirectBufferAddress(jobject buf)`:...

    protobuf+long+bytebuffer

    从网络或者存储中获取到protobuf编码的二进制数据后,可以创建一个`ByteBuffer`实例,然后调用protobuf编译器生成的类的解析方法,传入`ByteBuffer`实例进行解码。`ByteBuffer`会根据protobuf编码规则正确地读取和...

    【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip

    本教程重点讲解了`ByteBuffer`的几个关键属性:mark、position、limit和capacity,以及重要的操作方法如flip。这些概念和方法对于理解和使用Java NIO进行内存数据操作至关重要。 首先,`ByteBuffer`是`Buffer`接口...

    NIO(byteBuffer)按行读取文件

    使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    易语言汇编版ByteBuffer源码

    在ByteBuffer中,可能会包含诸如`put`、`get`、`flip`、`clear`等方法,分别用于写入数据、读取数据、改变读写位置以及重置缓冲区状态。 5. **性能优化**:由于是汇编实现,此ByteBuffer可能针对易语言的虚拟机进行...

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    5. 高效的API:Mina ByteBuffer的API设计更贴近网络编程需求,提供了如writeInt、readUTF等方法,使得数据序列化和反序列化更便捷。 总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注...

    ByteBuffer.cs

    主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题

    易语言-易语言汇编版ByteBuffer

    在易语言中,“易语言汇编版ByteBuffer”是一个针对网络通信协议处理的重要组件。ByteBuffer的设计灵感来源于Java语言中的同名类,它的主要功能是用于在网络协议的打包和解包过程中处理二进制数据。 ByteBuffer的...

    倾城服务器源码解读(一)

    ByteBuffer有多种构造方法,最常见的是`ByteBuffer.allocate(int capacity)`,用于创建一个指定容量的缓冲区。容量一旦设定,就不能改变。此外,还有`ByteBuffer.wrap(byte[] array)`,该方法允许我们基于已有的...

    java.nio API详解

    Buffer的API还包括clear、flip、rewind等方法,用于在读写模式之间切换和管理缓冲区状态。 2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个...

    ios-byteBuffer:在objective-c中重写一个类

    ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( ...

    dena-bytebuffer:dena-bytebuffer

    三、使用方法 1. **初始化**:创建一个新的`dena-bytebuffer`实例,可以指定初始大小或者传递一个现有的`ArrayBuffer`。 ```javascript var ByteBuffer = require('dena-bytebuffer'); var buffer = new ...

    java api之ByteBuffer基础、应用场景、实战讲解

    java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现

    Android开发问题集锦第一期[归纳].pdf

    这三个方法都是用于管理Buffer的状态,以便有效地读写数据: - `clear()`方法将position重置为0,limit设置为capacity,表示缓冲区已清空,准备接受新的数据。 - `rewind()`方法同样将position设回0,但保持limit...

Global site tag (gtag.js) - Google Analytics