【写在前面】 所谓读源码,三分看代码,七分看注释。英语不好怎么办,我帮你翻译!
package java.nio public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer> 复制代码
一个字节缓冲区。 这个类在字节缓冲区上定义了六种类型的操作:
字节缓冲区的创建要么通过 allocation 方法,它会分配一块控件给缓冲区的内容,要么 打包 一个已经存在的字节数组到缓冲区。
一个字节缓冲区 要么是直接(缓冲区)要么是非直接(缓冲区)。给定一个直接直接缓冲区,java虚拟机会尽最大努力直接对该缓冲区执行native(本地)I/O操作。那样的话,会尝试避免在每次调用一个底层操作系统的本地I/O操作之前(或之后)复制缓冲区的内容到(或者从)一个中间缓冲区。
一个直接字节缓冲区可以通过这个类的 allocateDirect 工厂方法创建。通过这个方法返回的缓冲区通常比非直接缓冲区有着更高的存储单元分配成本。直接缓冲区的内容可以存储在普通垃圾收集堆区之外,因此它们对于一个应用程序内存占用的影响可能不是很明显。因此推荐将字节缓冲区主要分配给受底层操作系统原生I/O操作支配的大(容量)长时间存活的缓冲区。通常来说,最好在程序性能产生可观收益时才分配直接缓冲区。
一个直接字节缓冲区也可以通过直接 mapping(映射)一个在内存中的文件区域而创建。(这是)java平台可选地支持字节字节缓冲区通过JNI本地代码的创建的一种实现。如果一个实例是这些指向了一块不可访问的内存区域中的一种,那么尝试访问这块区域不会改变缓冲区的内容,并且会导致在访问的时候或更晚一些,抛出一个未指定的异常。一个字节缓冲区是否为直接,可以通过调用
isDirect
方法决定。提供此方法是为了在性能关键代码执行显示缓冲区管理。
这个类定义了一些方法去读/写其他基本类型的值,除了boolean类型。(其他)基本类型会根据这个缓冲区当前的字节order转换(或字节转换)成字节序列,可以通过 order 方法去检索和修改这些字节序列。特定的字节order由 ByteOrder 的实例表示。一个字节缓冲区的初始order总是 BIG_ENDIAN 。
为了访问混杂的二级制数据,换言之,就是那些不同类型值的序列,这个类为每种类型定义了一个族群的绝对/相对的get和put方法。举个例子,针对32位浮点值,这个类定义了以下方法:
float getFloat() float getFloat(int index) void putFloat(float f) void putFloat(int index, float f) 复制代码
(这个类)同样为char,short,int,long和double类型定义了相应的方法。绝对的get和put方法的index参数是指的字节的索引,而不是要去读/写的类型的索引。
为了访问均匀的二进制数据,换言之,就是那些相同类型值得序列,这个类定义了能够根据给定的字节缓冲区创建视图的方法。视图缓冲区是简单的另一种缓冲区,它的内容是由字节缓冲区支持的。改变字节缓冲区的内容将会在视图缓冲区被看到,反之亦然。这两种缓冲区的position,limit和mark的值都是独立的。举个例子, asFloatBuffer 方法,当这个方法被调用的时候创建一个由字节缓冲器支持的 FloatBuffer 的实例。(这个类)同样为char,short,int,long和double类型定义了相应的视图创建方法。
与上面那些特定类型的get和put方法相比,视图缓冲区有三个重要的优势:
这个类的方法若是没有返回值,那么就会返回当前(调用这些方法的)对象。这就允许方法的调用成为链式。举个例子,下列的语句序列:
bb.putInt(0xCAFEBABE); bb.putShort(3); bb.putShort(45); 复制代码
可以被替换成(以下)单一语句:
bb.putInt(0xCAFEBABE).putShort(3).putShort(45); 复制代码
Since:1.4