您的位置:首页 > 编程语言 > Java开发

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

2017-09-18 22:25 239 查看
今天接着看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类为每一种原始数据类型提供了存取和转化方法。




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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nio