ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。

《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。

概述

ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。

使用

ByteBuffer最核心的方法是put(byte)和get()。分别是往ByteBuffer里写一个字节,和读一个字节。

值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。

这里插两个Channel方面的对象,以便更好的理解Buffer。

ReadableByteChannel是一个从Channel中读取数据,并保存到ByteBuffer的接口,它包含一个方法:

public int read(ByteBuffer dst) throws IOException;

WritableByteChannel则是从ByteBuffer中读取数据,并输出到Channel的接口:

public int write(ByteBuffer src) throws IOException;

那么,一个ByteBuffer的使用过程是这样的:

byteBuffer = ByteBuffer.allocate(N);

//读取数据,写入byteBuffer

readableByteChannel.read(byteBuffer);

//变读为写

byteBuffer.flip();

//读取byteBuffer,写入数据

writableByteChannel.write(byteBuffer);

看到这里,一般都不太明白flip()干了什么事,先从ByteBuffer结构说起:

ByteBuffer内部字段

byte[] buff

buff即内部用于缓存的数组。

position

当前读取的位置。

mark

为某一读过的位置做标记,便于某些时候回退到该位置。

capacity

初始化时候的容量。

limit

读写的上限,limit<=capacity。

图解

put

写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。

flip

写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。

get

从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。

clear

将position置为0,并不清除buffer内容。

mark相关的方法主要是mark()(标记)和reset()(回到标记),比较简单,就不画图了。

java bytebuffer读取_Java NIO学习笔记之二-图解ByteBuffer相关推荐

  1. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  2. 拉勾网《32个Java面试必考点》学习笔记之二------操作系统与网络知识

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  3. java读书雷_Java多态学习笔记

    java多态学习笔记 概述 多态的格式与使用 /* 代码中体现多态性:父类引用指向子类对象. */ 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称 ...

  4. core java 9 代码_Java Core 学习笔记——3.char/Unicode/代码点/代码单元

    通用字符集(UCS) UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集. UCS包括了其他所有的字符集(包含了已知语言的所以字符). ISO/IEC 1 ...

  5. java冰法_Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /*这是 * 一段注释, * 它跨越了多个行*/ public void ...

  6. java丐帮_java多线程学习笔记(二)

    上一节讲到多线程的创建,两种创建方式一种继承Thread类,一种实现Runnable接口: 常用的多线程函数: currentThread()方法        返回代码段正在被哪个线程调用的信息 i ...

  7. java框架白话_Java NIO框架Netty教程(二) 白话概念

    "Hello World"的代码固然简单,不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下,至少知道其是负责什.方便自己以后更灵活的使用和扩展. 声明,笔者 ...

  8. 了不起的盖茨比读后感---Java程序员学Python学习笔记(二)

    还是从logdown搬过来的,搬的时候稍微排版了下.今天废话比较多,其实这应该搬到豆掰电影去的.不喜的看官可以绕过.顺便推荐该电影打雷姐唱的一首歌,Young and Beautiful 我们奋力前行 ...

  9. java或运算键盘_JavaSE学习笔记(二)—— 运算符键盘录入

    一.运算符 运算符:就是对常量和变量进行操作的符号. 分类:算术运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,三目运算符 1.1 算术运算符 [+,-,*,/,%] classOperator ...

  10. java抽象类泛型_Java实训笔记(二)——-抽象类-接口-泛型-集合

    1.1方法的可变参数 从JDK1.5之后,定义方法时参数的个数可以变化 语法:最后一个数据类型后增加3个点 注意: 1.可变参数只能处于参数列表的最后: 2.一个方法中最多只能包含一个可变参数: 3. ...

最新文章

  1. 近世代数--子环--怎么判断是不是子环?
  2. 【ZT】详细设计文档规范
  3. boost::multiprecision模块mpfr_float相关的测试程序
  4. 窗口捕获显示黑屏_win10每次重启黑屏假死
  5. blockchain_eth客户端安装 geth使用 批量转账(二)
  6. 官网下载mysql实例数据库
  7. python 基础学习--运算符集合
  8. 在DataTable中执行DataTable.Select(条件),
  9. 【蓝桥杯】历年真题题目及题解汇总
  10. Linux tar打包命令详解
  11. android apk自动安装包下载,Android 实现apk文件下载并自动安装
  12. 【yolo训练数据集】标注好的垃圾分类数据集共享
  13. 50多款Android运用法式遭Rootkit病毒侵扰进犯
  14. Centos7配置ssh、rsh免密互信集群服务
  15. 自己写的grpc简单连接池,基于common pool2
  16. 数据探查平台-元数据对标专利 -- 普帝
  17. Internet Download Manager 6.37.15简体中文版
  18. 实习生风采 · 贰 | 张倬胜同学:攻关「孟子」轻量化预训练模型
  19. 江南科友 hac linux shell,运维安全审计系统(HAC 1000E、HAC 1000P)
  20. 骨龄测试软件app_【测试工具】这些APP实用测试工具,不知道你就out了!

热门文章

  1. C#抓取网页数据、分析并且去除HTML标签(转载)
  2. javascript中对象的深度克隆
  3. 设计模式 ( 二十) 备忘录模式
  4. 设计模式 (五) 原型模式
  5. SQL查找是否存在,别再count了
  6. 深入了解Spring的@Scope注解中作用域代理proxyMode属性的实现
  7. jenkins构建执行shell 所有命令出现command not found
  8. python爬虫学习整理——爬虫入门(1)
  9. Java集合类之Collection接口学习
  10. 2012-08-20 → 2012-08-26 周总结