JAVA NIO中的ByteBuffer

ByteBuffer 主要有以下属性

capacity

容量大小,表示最多可存放Byte 的数量

position

操作指针,当下一次调用get或put 时就会从这里读取,换句话说,每put/get一次,position就会递增一次。

limit

表示缓存区里 "有效" 的元素长度,
比如 ByteBuffer的容量capacity设置为10,那么这个10个字节默认都为0(表示无数值)
而limit 的作用则表示10个字节里有多少个字节是有效的。
假如往buffer put进5个字节,则limit为5.

ByteBuffer 主要的方法

clear() -- 主要用于在准备写入数据之前调用

清除Buffer里面的数据,即将所有字节清零,limit设置为0,position设置为0
每次读满buffer,准备要读下一次之前应该要清零,要不因为buffer满了而导致不能继续读。
源码:

public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
 }

flip() -- 主要用于写(即调用put方法)完数据后准备读(即调用get方法)

用于记录当前position位置(修改limit来记录当前有效字节位置),并将position清0。
源码:

public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
}

reset() -- 主要用于循环读取buffer的数据使用

将当前position指针移动到上次调用mark()方法进行记录的位置
例如广播同一条消息给不同的客户端
源码:

 public final Buffer reset() {
        int m = mark;
        if (m < 0)
            throw new InvalidMarkException();
        position = m;
        return this;
}

mark() -- 主要用于准备reset之前使用

记录当前position位置,等待下次reset时使用
源码:

public final Buffer mark() {
        mark = position;
        return this;
}

当往buffer里put 完一次数据以后,position 跟limit 都会同时递增,基本是同步,
假如put 了10个字节,position跟limit 从0 开始一直递增到10。
而position正如前面所述,用于get或put 的操作,如果在往buffer里put完以后,不进行对position设置而直接get 的话,那自然是读取不了数据的。

remaining()

查询当前还有多少 “有效” 的数据可用,即判断position与limit 之间的差值。

示例代码:

循环 读取 控制台的输入内容,并写入到socket中

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (true) {
   try {
           String s = reader.readLine();
           byte[] bytes = s.getBytes(utf8);
           buffer.clear();//每次写入buffer之前都清空一下
           buffer.put(bytes);
           buffer.flip();//每次准备从buffer里读取数据之前,都要重置一下position指针
           socketChannel.write(buffer);
       } catch (IOException e) {
           e.printStackTrace();
       }
}

为了初步了解,这段代码只是简单演示基本用法,实际上还要考虑bytes比buffer要大的情况,修改成如下代码:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (true) {
   try {
           String s = reader.readLine();
           byte[] bytes = s.getBytes(utf8);
           buffer.clear();
           for (int offset = 0; offset < bytes.length; offset++) {
                buffer.put(bytes[offset]);
                if (buffer.remaining() == 0) {
                     buffer.flip();
                     socketChannel.write(buffer);
                     buffer.clear();
                }
           }
    } catch (IOException e) {
       e.printStackTrace();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350