public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
官方概述: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 caseClears this buffer. The position is set to zero, the limit is set to * the capacity, and the mark is discarded. *
关键一句就是 This method does not actually erase the data in the buffer
,它并没有清除数据,只是把光标设置第一个位置上,限制变成容量大小。
调用clear()方法:position将被设回0,limit设置成capacity,换句话说,Buffer看起来被清空了,其实Buffer中的数据并未被清除,只是这些标记告诉我们可以从哪里开始往Buffer里写数据。
如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。
如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先写些数据,那么使用 compact()
方法。compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。
另有文章:
- https://blog.csdn.net/pfnie/article/details/52829549
- https://blog.csdn.net/qq_22701869/article/details/107091427
在学习Java NIO中看到关于Buffer的部分时提到bytebuffer调用clear()方法不会真正的删除掉buffer中的数据,只是把position移动到最前面,同时把limit调整为capacity。源码:public final Buffer clear() { position = 0; limit = capacity; mark = -1; return this; }官方概述:This method does
我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。
1、有一个文件共有20个字符:
abcdefghijklmnopqrst
2、我们声明一个char[15] buffer 大小的字符数组
Java代码
for(readChar(buffer...
在学习JavaNIO中看到关于Buffer的部分时提到buffer调用clear()方法不会真正的删除掉buffer中的数据,只是把position移动到最前面,同时把limit调整为capacity,忽然想到,如果不是真的删除掉buffer中的数据,那么如果之前写入buffer中五个字符:
CharBuffer buf = CharBuffer.allocate(48);
buf.put(n...
ByteBuffer继承于Buffer。
使用一个字节数组作为缓冲器。读取的数据和发送的数据会放入字节数组hb中。当数组达到一定大小,一次性写入通道或者读取。避免每次操作都要进行读写操作。
public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>
final by...
private ByteBuffer byteBuffer = ByteBuffer.allocate(300);//注意这里根据自己的需要预估大小
private byte b0d = (byte)0x0d,b0a = (byte)0x0a;//回车、换行字节,可以不需要我这样而直接写在代码里
private void doWithBytes
缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:
使用缓冲区有这么两个好处:
1、减少实际的物理读写次数
2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数
举个简单的例子,比如A地有1w块砖要搬到B地
public static void main(String[] args) {
try (FileChannel channel = new FileInputStream("data.txt").getChannel()){
// 定义缓冲区 allocate分配大小
ByteBuffer buffer = ByteBuffer.allocate(10);
while(tr
概述:直接看clear()官方介绍Clears this buffer. The position is set to zero, the limit is set to the capacity, and the mark is discarded.
Invoke this method before using a sequence of channel-read or put opera...
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;//标记位置,reset时需要
private int position = 0;//当前读取
private int limit;//...
`ByteBuffer.compact()`方法和`ByteBuffer.clear()`方法都是Java NIO中ByteBuffer类的方法,它们的作用不同。
`ByteBuffer.clear()`方法会将缓冲区的位置(position)设置为0,将界限(limit)设置成容量(capacity),从而清空缓冲区中的内容。但是,这些数据并没有真正地被清除,仍然存在于缓冲区中,只是处于“被遗忘”状态,可以被重新写入。
`ByteBuffer.compact()`方法会将缓冲区中的未读数据移动到缓冲区的起始位置,然后将位置(position)设置为未读数据的长度,将界限(limit)设置成容量(capacity)。这样,缓冲区中未读的数据就被移到了缓冲区的起始位置,已读过的数据则被覆盖掉或者被清除,缓冲区可以继续写入新的数据。
因此,`clear()`方法适用于需要清空缓冲区的情况,而`compact()`方法适用于需要在已读取数据的基础上继续写入数据的情况。