byteBuffer compact 和clear的区别
时间: 2023-07-16 11:12:19 浏览: 203
`ByteBuffer.compact()`方法和`ByteBuffer.clear()`方法都是Java NIO中ByteBuffer类的方法,它们的作用不同。
`ByteBuffer.clear()`方法会将缓冲区的位置(position)设置为0,将界限(limit)设置成容量(capacity),从而清空缓冲区中的内容。但是,这些数据并没有真正地被清除,仍然存在于缓冲区中,只是处于“被遗忘”状态,可以被重新写入。
`ByteBuffer.compact()`方法会将缓冲区中的未读数据移动到缓冲区的起始位置,然后将位置(position)设置为未读数据的长度,将界限(limit)设置成容量(capacity)。这样,缓冲区中未读的数据就被移到了缓冲区的起始位置,已读过的数据则被覆盖掉或者被清除,缓冲区可以继续写入新的数据。
因此,`clear()`方法适用于需要清空缓冲区的情况,而`compact()`方法适用于需要在已读取数据的基础上继续写入数据的情况。
相关问题
java ByteBuffer
Java ByteBuffer是Java NIO中的一个类,它是用来进行缓冲区数据读写的。它可以在内存中创建一个缓冲区,用来存储数据,并且提供了一系列的方法来操作缓冲区中的数据。
ByteBuffer有两种模式:读模式和写模式。在写模式下,我们可以向缓冲区中写入数据;在读模式下,我们可以从缓冲区中读取数据。当我们从写模式切换到读模式时,需要使用flip()方法,它会将缓冲区的limit设置为当前的position,并将position设置为0,这样我们就可以从缓冲区中读取数据了。
除了flip()方法之外,ByteBuffer还提供了很多其他的方法,如put()方法、get()方法、clear()方法、compact()方法等。put()方法用于向缓冲区中写入数据,get()方法用于从缓冲区中读取数据,clear()方法用于清空缓冲区,compact()方法用于将未读取的数据移动到缓冲区的起始位置。
ByteBuffer还有一些其他的特性,如支持直接内存访问、支持字节序转换等。它在网络编程和文件IO等场景中被广泛使用。
Java 中,怎么读写 ByteBuffer ?
在 Java 中,我们可以通过以下方式来读写 ByteBuffer:
1. 创建 ByteBuffer:
```java
ByteBuffer buffer = ByteBuffer.allocate(1024);
```
2. 写入数据:
```java
// 写入一个 byte
buffer.put((byte) 1);
// 写入一个 short
buffer.putShort((short) 2);
// 写入一个 int
buffer.putInt(3);
// 写入一个 long
buffer.putLong(4L);
// 写入一个 float
buffer.putFloat(5.0f);
// 写入一个 double
buffer.putDouble(6.0);
```
3. 切换读写模式:
在写入数据之后,我们需要将 ByteBuffer 的读写模式切换为读模式,才能读取数据。可以使用 `flip()` 方法来切换读写模式:
```java
buffer.flip();
```
4. 读取数据:
在切换到读模式之后,我们可以通过以下方式来读取数据:
```java
// 读取一个 byte
byte b = buffer.get();
// 读取一个 short
short s = buffer.getShort();
// 读取一个 int
int i = buffer.getInt();
// 读取一个 long
long l = buffer.getLong();
// 读取一个 float
float f = buffer.getFloat();
// 读取一个 double
double d = buffer.getDouble();
```
5. 回到写模式:
在读取数据之后,我们需要将 ByteBuffer 的读写模式切换回写模式,才能继续写入数据。可以使用 `clear()` 或 `compact()` 方法来切换到写模式:
- `clear()` 方法将缓冲区的位置设置为 0,限制设置为容量,即清空缓冲区。
```java
buffer.clear();
```
- `compact()` 方法将所有未读数据移到缓冲区的起始位置,然后将缓冲区的位置设置为未读数据的末尾,限制设置为容量。即将未读取的数据移动到缓冲区的起始位置,方便继续写入数据。
```java
buffer.compact();
```
注意:`clear()` 方法会清空整个缓冲区,包括未读取的数据。而 `compact()` 方法只会清空已读取的数据,未读取的数据将被移动到缓冲区的起始位置。
阅读全文