读书笔记-《Java NIO》:第二章 缓冲区(2)

今天接着看Java NIO第二章O(∩_∩)O~


1. 复制缓冲区



复制缓冲区,我们可以使用以下3个函数,以CharBuffer为例

Note:复制并非deep copy,可以理解为浅copy,复制的缓冲区和原来的缓冲区共用缓冲区的数据,原始缓冲区的改变会直接映射到copy的缓冲区,反之亦然;但各自有独立的position、limit、mark等。

1)duplicate()

创建一个新的Buffer对象,但并不copy数据,也就是浅复制;

2)asReadOnlyBuffer()

与duplicate的唯一区别就是,通过它创建的Buffer对象是只读的;

3)slice()

这个有意思,slice()得到的Buffer对象是以position为起点的剩余的缓冲区。


2. 字节缓冲区



我们知道操作系统和I/O设备操作的基本单位就是字节,字节缓冲区有必要再重新认识一下。

1)字节顺序

i>大端序

ii>小端序

Java NIO内部使用ByteOrder类封装了字节序。


Note:ByteBuffer不管硬件系统的字节序是什么,默认的字节序都是大端序;ByteBuffer的字节序可以通过调用order(ByteOrder bo)方法随时改变。


3. 直接缓冲区



要知道什么是直接缓冲区,我们得先知道什么是非直接缓冲区,回想一下第一章 焦点3:先复习下系统层面的I/O 那一小节。

这个就是非直接的缓冲区,每次I/O都需要用户空间和内核空间的两个缓冲区,而且数据基本都是重复的,具体的讲解,请参阅读书笔记-《Java NIO》 : 第一章 简介

下面这个就是直接的缓冲区,用户空间和内核空间通过映射,共用一块缓冲区。

上一节我们讲到,通过allocate()和wrap()分配的缓冲区都是非直接的,那么通过什么分配的缓冲区是直接的呢?

答案:通过allocateDirect()分配的缓冲区就是直接的缓冲区;如果你想知道分配的缓冲区是不是直接的,可以通过调用isDirect()来判断

4. 视图缓冲区



可以等价理解为数据库的视图,视图可以有自己的position、limit、mark,但没有独立的数据,它和原来的缓冲区共享数据。

ByteBuffer允许创建视图将byte类型缓冲区映射为其它类型的缓冲区。   

书中举了一个ByteBuffer映射为CharBuffer的例子,我们知道一个Char对应2个字节,映射关系如下:


5. 数据元素视图



ByteBuffer类为每一种原始数据类型提供了存取和转化方法。


第二章到这儿就讲完了,明天继续第三章(∩_∩)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值