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
分享到:
相关推荐
本教程重点讲解了`ByteBuffer`的几个关键属性:mark、position、limit和capacity,以及重要的操作方法如flip。这些概念和方法对于理解和使用Java NIO进行内存数据操作至关重要。 首先,`ByteBuffer`是`Buffer`接口...
缓冲区有位置(position)和限制(limit)的概念,位置表示当前读写的位置,限制则定义了缓冲区的可用范围。 二、创建ByteBuffer 1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的...
本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...
总的来说,Mina ByteBuffer是对Java NIO ByteBuffer的扩展和优化,它更加关注网络通信的性能和效率,提供了更适合网络服务开发的特性和功能。了解它们之间的差异对于高效利用Mina框架进行网络编程至关重要。通过阅读...
2. 调用`clear()`方法,重置`position`为0,但不改变缓冲区数据,以便再次写入。 3. 使用`get()`和`put()`方法进行数据的读写。例如,从ByteBuffer读取数据到byte数组: ```java byte[] bytearray = new byte[buf....
2. **ByteBuffer的flip, clear及rewind的区别** - `clear()`方法将position设为0,limit设为capacity,清除缓冲区的标记。 - `rewind()`方法也将position设为0,但不清除标记,保持原有状态。 - `flip()`方法则将...
问题二:ByteBuffer的flip, clear及rewind区别 这三个方法都是用于管理Buffer的状态,以便有效地读写数据: - `clear()`方法将position重置为0,limit设置为capacity,表示缓冲区已清空,准备接受新的数据。 - `...
Buffer的API还包括clear、flip、rewind等方法,用于在读写模式之间切换和管理缓冲区状态。 2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个...
`ByteBuffer`中有几个重要的方法:`flip()`, `clear()` 和 `rewind()`,它们分别控制着`ByteBuffer`的读写状态。 **方法区别**: 1. **clear()**:清除`ByteBuffer`的状态,即将位置(position)重置为0,并且极限...
这使得`ByteBuffer`不仅可以用于数据的存储和传输,还可以用于比较不同缓冲区之间的内容。 #### 三、ByteBuffer基本操作 `ByteBuffer`的基本操作包括: - **allocate**: 分配缓冲区空间。 - **put**: 写入数据。 - ...
byteBuffer.flip(); CharBuffer charBuffer = Charset.forName(sourceEncoding).decode(byteBuffer); byteBuffer.clear(); ByteBuffer targetByteBuffer = Charset.forName(targetEncoding).encode(charBuffer);...
Java提供了多种类型的缓冲区,包括`ByteBuffer`、`ShortBuffer`、`IntBuffer`、`CharBuffer`、`FloatBuffer`、`DoubleBuffer`和`LongBuffer`。这些缓冲区由各自的类管理,并且都在`java.nio`包中定义。 1. **通过`...
缓冲区有四个重要的属性:位置(position)、限制(limit)、容量(capacity)和标记(mark)。位置表示下一次读取或写入的索引,限制表示可读或可写的最大索引,容量是缓冲区的总大小,而标记用于记录位置,便于...
- **clear()**:清除整个 Buffer,position 被设置为 0,可以重新写入数据,原有数据未删除。 - **compact()**:清除 Buffer 已读数据,未读取数据移动到 position = 0 处,position 值为未读取数据长度 + 1,写入时...
在Java中,可以利用NIO(New I/O)中的`FileChannel`类和`ByteBuffer`类来进行高效的文件复制。下面将详细介绍这种方法的具体实现。 #### 示例代码解析 以下是一个使用`FileChannel`和`ByteBuffer`进行文件复制的...
ByteBuffer byteBufferIn = ByteBuffer.allocate(4096); // 缓冲区大小可根据实际情况调整 CharBuffer charBuffer = CharBuffer.allocate(4096); long position = 0; while ((position = inChannel.position())...
2. **NIO**:通过`FileChannel`和`ByteBuffer`等类实现,更适合处理大文件。 #### 三、使用NIO读取大文件 本文档中的代码示例主要采用NIO的方式读取大文件。下面详细介绍其中的关键步骤和技术要点。 #### 四、...
- **内部结构**:Buffer主要由`position`、`limit`和`capacity`三个属性控制读写流程: - `position`:表示当前正在读写的单位数据的位置或数量。在写模式下,`position`指示当前写入的单位数据数量;在读模式下,...
- `clear()`:重置position为0,并将limit设为capacity,准备写入新数据。 - `flip()`:将limit设为当前位置,然后重置position为0,准备读取数据。 - `rewind()`:重置position为0,limit保持不变,可以重新读取...