我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。
例如:
1、有一个文件共有20个字符:
abcdefghijklmnopqrst
2、我们声明一个char[15] buffer 大小的字符数组
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次。 那如果不加
这行代码的话,会不会出现我们文章开头的错误呢? 结果是 :“会的”
ok! 以上是我对该问题的描述
分享到:
相关推荐
【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip
本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下: 一、ByteBuffer 定义 在NIO中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时...
Android
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
仿安卓ByteBuffer 完美组包、拆包
ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( ...
java实现使用javolution完成数据接收过程中大小端转换的问题
主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题
protobuf+long+bytebuffer,利用protobuf.js实现编解码 所需的三个js库
由于对于本程序 116个字节以上的行才有意义,所以 在next实现方法中,有对 116 长度的判断,否则返回 null 修正了之前版本中的问题: 修正后的方法 private int readByte() throws IOException{ fbb.rewind(); ...
易语言汇编版ByteBuffer源码。主要用于各种网络协议的组包 具体用法可以点上面的网址 功能和jAVA的一样。@10371178。Tags:易语言汇编版ByteBuffer源码。
java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现
java中的中文乱码(其中介绍了中国近现代的汉字革命) java中为什么会产生中文乱码 如何解决java中的中文乱码
易语言汇编版ByteBuffer源码主要用于各种网络协议的组包 具体用法可以点上面的网址 功能和jAVA的一样
NULL 博文链接:https://chinaestone.iteye.com/blog/468138
dena-bytebuffer
描述:为了解决java与C结构通信过程中结构体解析问题。 主要功能:能友好的用java处理任何发送的C结构体对象,并且能发送java对象转换成C结构体接收的二进制。 功能说明 1、基于spring框架开发 2、对于结构体定义...