关于缓冲器ByteBuffer的三个方法:flip(),clear(),remind()。
一、flip():反转此缓冲区,将限制设置为当前位置,然后将位置设置为 0 !
之前的写操作会不断更新当前位置,当写操作完成之后,需调用此方法,将限制位置设置为当前位置,将当前位置设置为0,这样下一个读操作会从0开始,直到限制位置。
Java代码
1. /**
2. * Flips this buffer. The limit is set to the current position and then
3. * the position is set to zero. If the mark is defined then it is
4. * discarded.
5. *
6. * <p> This method is often used in conjunction with the {@link
7. * java.nio.ByteBuffer#compact compact} method when transferring data from
8. * one place to another. </p>
9. *
10. * @return This buffer
11. */
12. public final Buffer flip() {
13. limit = position;
14. position = 0;
15. mark = -1;
16. return this;
17. }
/**
* 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;
}
Java代码
1. public byte get() {
2. return hb[ix(nextGetIndex())];
3. }
4.
5. final int nextGetIndex() { // package-private
6. if (position >= limit)
7. throw new BufferUnderflowException();
8. return position++;
9. }
public byte get() {
return hb[ix(nextGetIndex())];
}
final int nextGetIndex() { // package-private
if (position >= limit)
throw new BufferUnderflowException();
return position++;
}
二、remain():与flip不同的是,不会修改限制位置。
比如初始化时:
Java代码
1. ByteBuffer buffer=ByteBuffer.allocate(1024);
ByteBuffer buffer=ByteBuffer.allocate(1024);
那么做读操作的时候就会读到第(1024-1)个索引,而flip却不一定能读到(1024-1)个索引,这取决于他的写操作的数据长度。
Java代码
1. /**
2. * Rewinds this buffer. The position is set to zero and the mark is
3. * discarded.
4. *
5. * <p> Invoke this method before a sequence of channel-write or <i>get</i>
6. * operations, assuming that the limit has already been set
7. * appropriately. For example:
8. *
9. * <blockquote><pre>
10. * out.write(buf); // Write remaining data
11. * buf.rewind(); // Rewind buffer
12. * buf.get(array); // Copy data into array</pre></blockquote>
13. *
14. * @return This buffer
15. */
16. public final Buffer rewind() {
17. position = 0;
18. mark = -1;
19. return this;
20. }
/**
* 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中,此时原来的内容就会被新的内容所覆盖!也不是全部覆盖,而是覆盖掉新数据所包含的字节数!所以看起来好象就是原来的内容被删除一样!
Java代码
1. /**
2. * Clears this buffer. The position is set to zero, the limit is set to
3. * the capacity, and the mark is discarded.
4. *
5. * <p> Invoke this method before using a sequence of channel-read or
6. * <i>put</i> operations to fill this buffer. For example:
7. *
8. * <blockquote><pre>
9. * buf.clear(); // Prepare buffer for reading
10. * in.read(buf); // Read data</pre></blockquote>
11. *
12. * <p> This method does not actually erase the data in the buffer, but it
13. * is named as if it did because it will most often be used in situations
14. * in which that might as well be the case. </p>
15. *
16. * @return This buffer
17. */
18. public final Buffer clear() {
19. position = 0;
20. limit = capacity;
21. mark = -1;
22. return this;
23. }
/**
* 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 th
四、ByteBuffer类中提供position(),remaining(),hasRemaining(),limit()等方法来验证以上三点。
五、上述代码中提到的:
Java代码
1. and the mark is discarded.