本文以CharBuffer为例,运行下代码结合注释看,有一个要点是无论什么操作,capacity不会变。

1.Buffer基本属性

    public void testProperties(){CharBuffer buffer = CharBuffer.allocate(10);//buffer初始状态showBuffer(buffer);//存入三个字符后buffer.put("abc");showBuffer(buffer);//flip,[position,limit]变成[0,position]buffer.flip();showBuffer(buffer);//读取2个字符后char c1 = buffer.get();char c2 = buffer.get();showBuffer(buffer);//clear,恢复成[0,capacity]buffer.clear();showBuffer(buffer);}
    static void showBuffer(CharBuffer buffer){StringBuilder sb = new StringBuilder();for (int i = 0; i < buffer.limit(); i++) {char c = buffer.get(i);if(c == 0){c = '.';}sb.append(c);}System.out.printf("position=%d, limit=%d, capacity=%d, content=%s\n",buffer.position(),buffer.limit(),buffer.capacity(),sb.toString());}

2.读取

    public void testGet(){CharBuffer buffer = CharBuffer.allocate(10);buffer.put("abc");BufferAttr.showBuffer(buffer);buffer.flip();char[] chars = new char[buffer.remaining()];buffer.get(chars);System.out.println(chars);}

3.mark标记和reset重置到标记处

    public void testMark(){CharBuffer buffer = CharBuffer.allocate(10);showBuffer(buffer);//mark设置为3buffer.position(3).mark().position(5);showBuffer(buffer);//reset,position=markbuffer.reset();showBuffer(buffer);}

4.compact压缩到[position,limit]

    public void testCompact(){CharBuffer buffer = CharBuffer.allocate(10);buffer.put("abcde");buffer.flip();//先读取两个字符buffer.get();buffer.get();showBuffer(buffer);//压缩buffer.compact();//继续写入buffer.put("fghi");buffer.flip();showBuffer(buffer);//从头读取后续的字符char[] chars = new char[buffer.remaining()];buffer.get(chars);System.out.println(chars);}

5.duplicate复制

    //duplicate方法指向同一个内部数组,但分别管理各自的属性public void testDuplicate(){CharBuffer buffer = CharBuffer.allocate(10);buffer.put("abcde");CharBuffer buffer1 = buffer.duplicate();buffer1.clear();buffer1.put("alex");showBuffer(buffer);showBuffer(buffer1);}

6.slice切片

    //slice方法会把buffer切出去一部分形成新的切片,两个buffer共用切片,但分别管理各自的属性public void testSlice(){CharBuffer buffer = CharBuffer.allocate(20);buffer.put("abcdefghij");buffer.position(5);CharBuffer slice = buffer.slice();showBuffer(buffer);showBuffer(slice);slice.position(5);slice.put("kl");showBuffer(buffer);showBuffer(slice);}

参考文章:

https://zhuanlan.zhihu.com/p/25701512

Java NIO(二)缓冲区Buffer相关推荐

  1. Java NIO3:缓冲区Buffer

    在上一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如 ...

  2. Java NIO之缓冲区

    1.简介 Java NIO 相关类在 JDK 1.4 中被引入,用于提高 I/O 的效率.Java NIO 包含了很多东西,但核心的东西不外乎 Buffer.Channel 和 Selector.本文 ...

  3. Java NIO 编程:Buffer、Channel、Selector原理详解

    1 Java 中的 I/O模型:BIO.NIO.AIO 1.1 BIO.NIO.AIO概念介绍 I/O 模型简单的理解:就是 用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. Ja ...

  4. 6. 彤哥说netty系列之Java NIO核心组件之Buffer

    --日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...

  5. JAVA NIO之Direct Buffer 与 Heap Buffer的区别?

    2019独角兽企业重金招聘Python工程师标准>>> 个人总结 Direct Buffer  vs.  Heap Buffer 1. 劣势:创建和释放Direct Buffer的代 ...

  6. Java NIO中的Buffer

    简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...

  7. buffer java nio_Java NIO深入理解Buffer(缓冲区)

    前言 Github:https://github.com/yihonglei/java-all Project:java-nio 一 Buffer概述 Java NIO中的Buffer用于和NIO通道 ...

  8. Java NIO ———— Buffer 缓冲区详解

    引言 缓冲区是一个用于特定基本类型的容器.由java.nio 包定义,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的 Buffer ,主要用于与NIO 通道进行交互.数据从通道存 ...

  9. Java NIO系列教程(三) Buffer

    2019独角兽企业重金招聘Python工程师标准>>> Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本 ...

  10. 你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)

    本文主要讲解NIO的简介.NIO和传统阻塞I/O有什么区别.NIO模型和传统I/O模型之间的对比.以及围绕NIO的三大组件来讲解,理论代码相结合. 很喜欢一句话:"沉下去,再浮上来" ...

最新文章

  1. Java Setamp;HashSet
  2. 重绘(repaint)与渲染(reflow)
  3. linux下实现dns服务器,实现Linux操作系统下DNS服务器的搭建
  4. Unity3D笔记 愤怒的小鸟一场景切换
  5. hdu 6148 数位dp
  6. [Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]
  7. 语音识别学习日志 2019-7-14 语音识别基础知识准备2 {EM算法与混合高斯模型(Gaussian mixture model, GMM)}
  8. LeetCode12 整数转罗马数字
  9. 测试用例场景法3个例子
  10. 《跟我学Shiro》——张开涛(链接)
  11. 机器人运动学基础——旋转矩阵
  12. PlatformIO for CLion 创建工程时出现 gathering information问题解决方法
  13. 测试属性4 –准确性
  14. 松弛法求解给定边界条件的泊松方程
  15. JAVA利用第三方平台发送短信验证码
  16. WeGeek Talk | 美团外卖
  17. centos Iptables学习笔记
  18. 【架构设计】如何实现3ms内从1000w级别的用户里面随机抽奖出100名用户
  19. STM32F1CAN通讯
  20. 萧县机器人_萧县共享碾米机多少钱一台?

热门文章

  1. Cesium 通过scaleByDistance设置远小近大的广告牌图形视觉效果
  2. Java电商系统秒杀怎么做?
  3. nao机器人行走速度_NAO机器人学习笔记(2)
  4. 车用主驱电机系统开发实战
  5. 基于AIE的贵阳市两湖一库水体区域识别
  6. 《有限与无限的游戏》第三章 我是自己的天才:经典摘抄(1)
  7. NLTK-007:分类文本(文档情感分类)
  8. shell脚本之双重循环
  9. 我用 Python 爬了点你们喜欢的电影,这些电影真的很不错
  10. 在.NET 6中可以期待什么