转载

ByteBuffer

【写在前面】 所谓读源码,三分看代码,七分看注释。英语不好怎么办,我帮你翻译!

package java.nio
public abstract class ByteBuffer
extends Buffer
implements Comparable<ByteBuffer>
复制代码

一个字节缓冲区。 这个类在字节缓冲区上定义了六种类型的操作:

  • 绝对和相对的 getput 方法去读/写单个字节。
  • 相对的 大块的get 方法从这个缓冲区传输连续的字节序列到一个数组中。
  • 相对的 大块的put 方法从一个字节数组或其他字节缓冲器传输连续的字节序列到这个缓冲区。
  • 绝对和相对的 getput 方法,读/写其他基本类型的值。按照特定的字节协议转换它们为字节或者从字节转换为其他基本类型。
  • 创造 视图缓冲区 ,允许一个字节缓存区被看作一个可以包含其他基本类型的值的缓冲区。
  • 一个字节缓冲区 压缩重复切片 的方法。

字节缓冲区的创建要么通过 allocation 方法,它会分配一块控件给缓冲区的内容,要么 打包 一个已经存在的字节数组到缓冲区。

Direct vs. non-direct buffers(直接 VS 非直接缓冲区)

一个字节缓冲区 要么是直接(缓冲区)要么是非直接(缓冲区)。给定一个直接直接缓冲区,java虚拟机会尽最大努力直接对该缓冲区执行native(本地)I/O操作。那样的话,会尝试避免在每次调用一个底层操作系统的本地I/O操作之前(或之后)复制缓冲区的内容到(或者从)一个中间缓冲区。

一个直接字节缓冲区可以通过这个类的 allocateDirect 工厂方法创建。通过这个方法返回的缓冲区通常比非直接缓冲区有着更高的存储单元分配成本。直接缓冲区的内容可以存储在普通垃圾收集堆区之外,因此它们对于一个应用程序内存占用的影响可能不是很明显。因此推荐将字节缓冲区主要分配给受底层操作系统原生I/O操作支配的大(容量)长时间存活的缓冲区。通常来说,最好在程序性能产生可观收益时才分配直接缓冲区。

一个直接字节缓冲区也可以通过直接 mapping

(映射)一个在内存中的文件区域而创建。(这是)java平台可选地支持字节字节缓冲区通过JNI本地代码的创建的一种实现。如果一个实例是这些指向了一块不可访问的内存区域中的一种,那么尝试访问这块区域不会改变缓冲区的内容,并且会导致在访问的时候或更晚一些,抛出一个未指定的异常。一个字节缓冲区是否为直接,可以通过调用

isDirect

方法决定。提供此方法是为了在性能关键代码执行显示缓冲区管理。

Access to binary data(访问二进制数据)

这个类定义了一些方法去读/写其他基本类型的值,除了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方法相比,视图缓冲区有三个重要的优势:

  • 一个视图缓冲区的索引不是以字节为单位,而是以指定类型大小为单位。
  • 一个视图缓冲器提供了相对地批量get和put方法,去传输连续的值的序列从一个缓冲区到一个数组或其他想同类型缓冲区。
  • 一个视图缓冲区很可能是非常高效的,因为当且仅当它是由直接的字节缓冲区支持,那么他将也会是个直接(缓冲区)。 一个视图缓冲区的字节order在视图创建的时候,固定为当时字节缓冲区的字节order。

Invocation chaining(链式调用)

这个类的方法若是没有返回值,那么就会返回当前(调用这些方法的)对象。这就允许方法的调用成为链式。举个例子,下列的语句序列:

bb.putInt(0xCAFEBABE);
bb.putShort(3);
bb.putShort(45);
复制代码

可以被替换成(以下)单一语句:

bb.putInt(0xCAFEBABE).putShort(3).putShort(45);
复制代码

Since:1.4

原文  https://juejin.im/post/5d5101fb5188250cad7f613d
正文到此结束
Loading...