Java NIO的核心部件:

Buffer

Channel

Selector

Buffer

是一个数组,但具有内部状态。如下4个索引:

  • capacity:总容量
  • position:下一个要读取/写入的元素索引
  • limit:限制,第一个不能读取/写入的元素索引
  • mark:位置标记,重置position
  • //通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position//
  • 0 <= mark <= position <= limit <= capacity

用例:

初始状态:

初始如上图,添加数据:put()方法会改变position的值,但put(int,object)不会改变

buffer.put((byte) H).put((byte) e).put((byte) l).put((byte) l).put((byte) o);

在上图的基础上进行flip()操作,则会进入下面的状态:

flip:将缓冲区准备为数据传出状态,即limit=position,position=0

在上图基础上,进行get操作,position会后移,知道position=limit,如下图:

在上图基础上,进行rewind()的操作,position为0,limit不变,如下图,如需多次读取缓冲区数据,可以在两次读取之间使用rewind()。

假设新的状态如下图:

在新状态下进行compact()操作,进入下面状态

在新状态下进行clear()操作,返回到初始状态,即position=0,limit=capacity

Buffer的类型:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Buffer的分配:工厂方法

1、allocate

//申请48字节

ByteBuffer buf = ByteBuffer.allocate(48);

//申请1024字符

CharBuffer buf = CharBuffer.allocate(1024);

2、wrap,包装一个已有的数组

char [] myArray = new char [100];
CharBuffer charbuffer = CharBuffer.wrap (myArray);
注意,这样的方式创建的Buffer,将不会在堆上创建新的数组,而是直接利用myArray做backing store,这意味着任何对myArray或者buffer的修改都将影响到buffer或者myArray。

3、复制Buffer:“浅拷贝”

  • a)通过duplicate()方法将返回一个新创建的buffer,这个新buffer与原来的Buffer共享数据,一样的capacity,但是有自己的position、limit和mark属性。
  • b)通过asReadOnlyBuffer()方法复制的buffer与duplicate()类似,是只读的,不能调用put。
  • c)slice()方法,故名思议,类似切割一个Buffer出来,与duplicate类似,但是它将从原来Buffer的当前position开始,并且capacity等于原来Buffer的剩余元素数目,也就是(limit-position)。

向Buffer写数据

从channel写入到Buffer

int bytesRead = inChannel.read(buf);

通过Buffer的put方法写入

buf.put(127);

相对位置:在position之后写入数据,并改变position

put(byte b);

put(byte[] src);

put(byte[] src, int offset, int length);

put(ByteBuffer src);

绝对位置:提供写入的位置,并不改变position值。

put(int index, byte b);

从Buffer读数据

从channel读出数据

int bytesWritten = inChannel.write(buf);

通过Buffer的get方法

相对位置

get()

get(byte[] dst);

get(byte[] dst, int offset, int length);

绝对位置

get(int index);

转载于:https://www.cnblogs.com/dorothychai/p/4178530.html

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

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...

  10. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

最新文章

  1. 使用wget在linux服务器上下载oracle软件
  2. maven 常用插件3
  3. vim代码格式化工具autopep8
  4. 微信小程序将页面按钮悬浮固定在底部
  5. 多生产者_你是生产者还是消费者?这决定了你的层次。
  6. Spring Data Elasticsearch案例详解
  7. collectors 求和_Java-Collectors常用的20个方法
  8. pythongui界面实例_wxPython:python首选的GUI库实例分享(5)
  9. 论文笔记_S2D.57_2018-IROS_LIMO:激光雷达单目视觉里程计
  10. 【BFS】迷宫问题c++代码详解(逐句分析)
  11. java单元测试的编写及运行方法
  12. dwcc怎么设置html默认,Dreamweaver CC 2019如何设置界面首选项?
  13. React Toolkit使用
  14. 分形图的递归算法简介
  15. 在线客服服务干货:如何与客户进行有效沟通?
  16. 夜游神安卓模拟器安装
  17. 计算机教室英语手抄报,我的教室英语手抄报
  18. 苹果的名字测试软件,抖音手机称重是什么软件叫什么名字 怎么用iPhone苹果手机称重...
  19. program received signal sigsegv,需要注意的问题!!!!!!
  20. percona-tool文档说明(总)

热门文章

  1. DevOps使用教程 华为云(5)迭代计划 进度管理
  2. Kubernetes 小白学习笔记(13)--k8s集群路线-init流程
  3. FISCO BCOS Solidity 智能合约 返回json对象、字典mapping、结构体
  4. 关于局部变量的几个难点
  5. ios开发闹钟步骤_苹果快捷指令自动化(起床关闹钟后自动播放音乐)
  6. c语言投票程序设计报告书,C语言程序设计报告书
  7. 编写MapReduce程序,实现WordCount
  8. UPUPW PHP环境集成包,增加多个PHP版本支持,可选择使用
  9. Android 横竖屏切换问题
  10. jq向php文件传json,jQuery向后台传入json格式数据的方法