`
hyleeon
  • 浏览: 8378 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ByteBuffer的position、flip和clear

    博客分类:
  • Java
阅读更多
position测试:
ByteBuffer bb = ByteBuffer.allocate(10);
System.out.println("起始position: "+bb.position());
bb.put(5, (byte)15);
System.out.println("指定位置put数据之后的position: "+bb.position());
bb.put((byte)20);
System.out.println("直接put数据之后的position: "+bb.position());
bb.put((byte)20);
System.out.println("再次直接put数据之后的position: "+bb.position());
bb.clear();
System.out.println("调用clear之后的position: "+bb.position());

输出结果:
起始position: 0
指定位置put数据之后的position: 0
直接put数据之后的position: 1
再次直接put数据之后的position: 2
调用clear之后的position: 0

结论:
  • byte buffer的position起始值是0
  • 指定位置的put不会导致position偏移
  • clear重置position为0

--------------------------------------------------------------------------------------------------------------------------------------------------------------
flip测试:
ByteBuffer bb = ByteBuffer.allocate(10);
System.out.println("起始position: "+bb.position());
System.out.println("起始limit: "+bb.limit());
System.out.println("起始capacity: "+bb.capacity());
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
System.out.println("put五个数据之后的position: "+bb.position());
System.out.println("put五个数据之后的limit: "+bb.limit());
System.out.println("put五个数据之后的capacity: "+bb.capacity());
bb.flip();
System.out.println("调用flip之后的position: "+bb.position());
System.out.println("调用flip之后的limit: "+bb.limit());
System.out.println("调用flip之后的capacity: "+bb.capacity());
bb.clear();
System.out.println("调用clear之后的position: "+bb.position());
System.out.println("调用clear之后的limit: "+bb.limit());
System.out.println("调用clear之后的capacity: "+bb.capacity());
输出结果:
起始position: 0
起始limit: 10
起始capacity: 10
put五个数据之后的position: 5
put五个数据之后的limit: 10
put五个数据之后的capacity: 10
调用flip之后的position: 0
调用flip之后的limit: 5
调用flip之后的capacity: 10
调用clear之后的position: 0
调用clear之后的limit: 10
调用clear之后的capacity: 10

结论:
  • 调用flip之后产生的效果是先将当前position的值设置为limit,然后将position重置为0
  • flip不会影响buffer的容量
  • clear导致buffer所有状态重置


如果buffer的capacity是10,put(10, value)将出现java.lang.IndexOutOfBoundsException异常,因为position重0开始,容量为10,那么有效索引为0-9
分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    缓冲区有位置(position)和限制(limit)的概念,位置表示当前读写的位置,限制则定义了缓冲区的可用范围。 二、创建ByteBuffer 1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的...

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

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

    Java NIO学习笔记——ByteBuffer用法

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

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

    总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注网络通信的性能和效率,提供了更适合网络服务开发的特性和功能。了解它们之间的差异对于高效利用Mina框架进行网络编程至关重要。通过阅读...

    Android在JNI中使用ByteBuffer的方法

    2. 调用`clear()`方法,重置`position`为0,但不改变缓冲区数据,以便再次写入。 3. 使用`get()`和`put()`方法进行数据的读写。例如,从ByteBuffer读取数据到byte数组: ```java byte[] bytearray = new byte[buf....

    Android开发问题集锦第一期.pdf

    2. **ByteBuffer的flip, clear及rewind的区别** - `clear()`方法将position设为0,limit设为capacity,清除缓冲区的标记。 - `rewind()`方法也将position设为0,但不清除标记,保持原有状态。 - `flip()`方法则将...

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

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

    java.nio API详解

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

    Android开发问题集锦第一期

    `ByteBuffer`中有几个重要的方法:`flip()`, `clear()` 和 `rewind()`,它们分别控制着`ByteBuffer`的读写状态。 **方法区别**: 1. **clear()**:清除`ByteBuffer`的状态,即将位置(position)重置为0,并且极限...

    java文件编码转换

    byteBuffer.flip(); CharBuffer charBuffer = Charset.forName(sourceEncoding).decode(byteBuffer); byteBuffer.clear(); ByteBuffer targetByteBuffer = Charset.forName(targetEncoding).encode(charBuffer);...

    Java中的缓冲区(直接缓冲区、非直接缓冲区等).docx

    Java提供了多种类型的缓冲区,包括`ByteBuffer`、`ShortBuffer`、`IntBuffer`、`CharBuffer`、`FloatBuffer`、`DoubleBuffer`和`LongBuffer`。这些缓冲区由各自的类管理,并且都在`java.nio`包中定义。 1. **通过`...

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

    缓冲区有四个重要的属性:位置(position)、限制(limit)、容量(capacity)和标记(mark)。位置表示下一次读取或写入的索引,限制表示可读或可写的最大索引,容量是缓冲区的总大小,而标记用于记录位置,便于...

    javaNIO学习笔记

    - **clear()**:清除整个 Buffer,position 被设置为 0,可以重新写入数据,原有数据未删除。 - **compact()**:清除 Buffer 已读数据,未读取数据移动到 position = 0 处,position 值为未读取数据长度 + 1,写入时...

    文件的复制

    在Java中,可以利用NIO(New I/O)中的`FileChannel`类和`ByteBuffer`类来进行高效的文件复制。下面将详细介绍这种方法的具体实现。 #### 示例代码解析 以下是一个使用`FileChannel`和`ByteBuffer`进行文件复制的...

    Java文件编码转换源码

    ByteBuffer byteBufferIn = ByteBuffer.allocate(4096); // 缓冲区大小可根据实际情况调整 CharBuffer charBuffer = CharBuffer.allocate(4096); long position = 0; while ((position = inChannel.position())...

    java读取大文件大全

    2. **NIO**:通过`FileChannel`和`ByteBuffer`等类实现,更适合处理大文件。 #### 三、使用NIO读取大文件 本文档中的代码示例主要采用NIO的方式读取大文件。下面详细介绍其中的关键步骤和技术要点。 #### 四、...

    主题JAVANIO简介知识点.pdf

    - **内部结构**:Buffer主要由`position`、`limit`和`capacity`三个属性控制读写流程: - `position`:表示当前正在读写的单位数据的位置或数量。在写模式下,`position`指示当前写入的单位数据数量;在读模式下,...

    Java_NIO_API详解

    - `clear()`:重置position为0,并将limit设为capacity,准备写入新数据。 - `flip()`:将limit设为当前位置,然后重置position为0,准备读取数据。 - `rewind()`:重置position为0,limit保持不变,可以重新读取...

Global site tag (gtag.js) - Google Analytics