我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。
例如:
1、有一个文件共有20个字符:
abcdefghijklmnopqrst
2、我们声明一个char[15] buffer 大小的字符数组
Java代码
for(readChar(buffer ) != -1) { //将文件的字符读入到buffer中,一次最多读15个 println(toString(buffer)) ;//打印当前结果 }
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst[b]fghijklmnopqrst[/b] ok 这结果显然是错误的: 第一次buffer的结果是: abcdefghijklmno (15个字符) 第二次buffer的结果是 pqrstfghijklmno(前面5个字符是第二次读取的, 后面的10个字符是第一次读取的 ) 所以接下俩我们应该改造一下代码: int pos; for((pos=readChar(buffer)) != -1) { //将文件的字符读入到buffer中,一次最多读15个 println(toString(buffer, 0, pos)) ;//打印当前结果 }
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst 很显然这次是正确的。 ok,那我们从这个角度是思考ByteBuffer,我们同样需要ByteBuffer对象中的标志符去控制类似的情况 ByteBuffer buffer = ByteBuffer.alloate(20); while(read(buffer ) > 0) { //每次写一个值,position都会加1 //读值时,我们当然要从起始开始位置读了,所以执行,读到limit位置结束 buffer.rewind(); print(buffer); //那flip、clear,什么时候执行呢,其中clear方法,是将ByteBuffer标识重置为初始状态,ok那我们来说说flip 我对flip的理解是 提高效率。 首先看一下flip代码: public final Buffer flip() { limit = position; position = 0; mark = -1; return this; }
- 仔细思考一下: 例如共有100个字节, ok!那么知道最后一次向buffer中实际读取的是10个字节,如果我在
- “print(buffer);”之后加入 buffer.flip();代码,那么最后一次buffer的中position仅加了10次。 那如果不加
- 这行代码的话,会不会出现我们文章开头的错误呢? 结果是 :“会的”