转载自 Java NIO学习笔记之图解ByteBuffer

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

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

概述

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

使用

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

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

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

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

1
2
<!-- lang: java -->
public int read(ByteBuffer dst) throws IOException;

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

1
2
<!-- lang: java -->
public int write(ByteBuffer src) throws IOException;

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

1
2
3
4
5
6
7
8
<!-- lang: java -->
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 NIO学习笔记之图解ByteBuffer相关推荐

  1. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  3. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  4. Java nio 学习笔记 相关知识

    http://blog.csdn.net/tsyj810883979/article/details/6876594 一.基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. ...

  5. Java NIO学习笔记 三 散点/收集 和频道转换

    Java NIO散点/收集 Java NIO带有内置的分散/收集支持.散点/收集是读取和写入渠道过程中使用的概念. 从通道散射读取是将数据读入多个缓冲区的读取操作.因此,数据可以从通道"散布 ...

  6. Java NIO学习笔记

    印象中,我对于NIO的学习,最早是来源于一次面试,面试官问我:"可不可以讲一下Netty的线程模型?".当然了,这个问题没答上来,于是回去后就开始搜Netty的资料,了解Netty ...

  7. Java NIO 学习笔记 缓冲区补充

    1.缓冲区分配 方法   以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...

  8. java nio 学习笔记2

    直接缓冲区和非直接缓冲区 这里主要想讲讲直接和非直接缓冲区的区别 1.简单介绍 直接缓冲区:在jvm中,字节数组可能不会在内存数组中连续储存,而gc也有可能随时移动这个数组的内存地址.而同时在java ...

  9. Java NIO学习笔记三------Chanel的四种实现篇

    FileChannel FileChannel是什么 FileChannel是一个连接到文件的通道,可以通过文件通道读写文件.它无法设置为非阻塞模式,总是运行在阻塞模式下. 打开FileChannel ...

最新文章

  1. Linux grep,egrep及相应的正则表达式用法详解
  2. R.drawable 转 bitmap
  3. 5g时代计算机网络过时,5g云电脑 取代主机(5g时代云电脑会普及吗)
  4. linux 线程 waitforsingleobject,用Sleep或WaitForSingleObject实现线程的休眠 | 求索阁
  5. QT每日一练day5:QLabel和按钮窗口打印功能
  6. sob攻略超详细攻略_2020成都超详细旅游,美食攻略
  7. CCF NOI1022 平均年龄
  8. Charles(网络封包分析工具)
  9. android studio快捷键与Eclipse快捷键对比-没有之一
  10. 【ASP.NET 基础】ASP.NET 目录操作
  11. WEB学习——JavaScript
  12. 理想边界尺寸怎么算_GDamp;T 几何尺寸和公差 | ASME14.52018标准弄错了吗?
  13. vue调用服务器图片
  14. html audio缓冲效果实现
  15. linux上热编译react,reactos终于被成功编译通过
  16. Games101-闫令琪 1-4讲 基础知识+变换 (笔记整理)
  17. jstack 命令使用经验总结和线程性能诊断脚本
  18. 【MATLAB】MATLAB 可视化之极坐标图
  19. 频数直方图的步骤_频数分布直方图的画法举例
  20. jQuery效果-隐藏和显示

热门文章

  1. c语言 大数相加,c/c++开发分享C语言计算大数相加的方法
  2. [JavaWeb-Bootstrap]Bootstrap响应式布局
  3. 经典排序算法(9)——桶排序算法详解
  4. P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)
  5. Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp
  6. Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈
  7. 【WC2016】挑战NPC 【带花树】【建图】
  8. 【CF700E】Cool Slogans【后缀自动机】【可持久化线段树合并】【树上倍增】
  9. 【CF1182D】Complete Mirror【树的重心】
  10. CF1253F Cheap Robot