- 所有已实现的接口:
Comparable<ByteBuffer>
映射字节缓冲区是通过FileChannel.map 方法创建的。此类使用特定于内存映射文件区域的操作扩展 ByteBuffer 类。
映射的字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前一直有效。
映射字节缓冲区的内容可以随时更改,例如,如果map文件的相应区域的内容被该程序或其他程序更改。此类更改是否发生以及何时发生取决于操作系统,因此未指定。
映射字节缓冲区的全部或部分可能随时变得不可访问,例如,如果map文件被截断。尝试访问映射字节缓冲区的不可访问区域不会更改缓冲区的内容,并且会导致在访问时或稍后的某个时间抛出未指定的异常。因此,强烈建议采取适当的预防措施,以避免此程序或同时运行的程序对映射文件进行操作,读取或写入文件内容除外。
映射字节缓冲区在其他方面的行为与普通的直接字节缓冲区没有区别。
- 自从:
- 1.4
-
方法总结
修饰符和类型方法描述final MappedByteBufferclear()清除此缓冲区。abstract MappedByteBuffercompact()压缩此缓冲区(可选操作).abstract MappedByteBuffer创建一个共享此缓冲区内容的新字节缓冲区。final MappedByteBufferflip()翻转此缓冲区。final MappedByteBufferforce()强制将对此缓冲区内容所做的任何更改写入包含映射文件的存储设备。final MappedByteBufferforce(int index, int length) 强制将对此缓冲区内容的区域所做的任何更改写入包含映射文件的存储设备。final booleanisLoaded()告知此缓冲区的内容是否驻留在物理内存中。final MappedByteBufferlimit(int newLimit) 设置此缓冲区的限制。final MappedByteBufferload()将此缓冲区的内容加载到物理内存中。final MappedByteBuffermark()在其位置设置此缓冲区的标记。final MappedByteBufferposition(int newPosition) 设置此缓冲区的位置。final MappedByteBufferreset()将此缓冲区的位置重置为先前标记的位置。final MappedByteBufferrewind()倒带此缓冲区。abstract MappedByteBufferslice()创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。abstract MappedByteBufferslice(int index, int length) 创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。在类 java.nio.ByteBuffer 中声明的方法
alignedSlice, alignmentOffset, allocate, allocateDirect, array, arrayOffset, asCharBuffer, asDoubleBuffer, asFloatBuffer, asIntBuffer, asLongBuffer, asReadOnlyBuffer, asShortBuffer, compareTo, equals, get, get, get, get, get, get, getChar, getChar, getDouble, getDouble, getFloat, getFloat, getInt, getInt, getLong, getLong, getShort, getShort, hasArray, hashCode, isDirect, mismatch, order, order, put, put, put, put, put, put, put, put, putChar, putChar, putDouble, putDouble, putFloat, putFloat, putInt, putInt, putLong, putLong, putShort, putShort, toString, wrap, wrap在类 java.nio.Buffer 中声明的方法
capacity, hasRemaining, isReadOnly, limit, position, remaining
-
方法详情
-
isLoaded
public final boolean isLoaded()告知此缓冲区的内容是否驻留在物理内存中。true的返回值意味着很可能此缓冲区中的所有数据都驻留在物理内存中,因此可以在不引起任何虚拟内存页面错误或 I/O 操作的情况下进行访问。false的返回值并不一定意味着缓冲区的内容不驻留在物理内存中。返回值是一个提示,而不是保证,因为在调用此方法返回时,底层操作系统可能已经调出缓冲区的一些数据。
- 返回:
true如果此缓冲区的内容可能驻留在物理内存中
-
load
将此缓冲区的内容加载到物理内存中。此方法尽最大努力确保在返回时此缓冲区的内容驻留在物理内存中。调用此方法可能会导致发生一些页面错误和 I/O 操作。
- 返回:
- 这个缓冲区
-
force
强制将对此缓冲区内容所做的任何更改写入包含映射文件的存储设备。该区域在此缓冲区中从索引零开始,大小为capacity()字节。此方法的调用与调用force(0,capacity())的行为方式完全相同。如果map到此缓冲区的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建缓冲区或自上次调用此方法以来对缓冲区所做的所有更改都已写入该设备。
如果文件不驻留在本地设备上,则不提供此类保证。
如果此缓冲区未映射到读/写模式 (
FileChannel.MapMode.READ_WRITE),则调用此方法可能无效。特别是,该方法对以只读或私有映射模式映射的缓冲区没有影响。此方法可能会或可能不会影响特定于实现的映射模式。- 返回:
- 这个缓冲区
- 抛出:
UncheckedIOException- 如果发生 I/O 错误,将缓冲区的内容写入包含映射文件的存储设备
-
force
强制将对此缓冲区内容的区域所做的任何更改写入包含映射文件的存储设备。该区域在此缓冲区中从给定的index开始,大小为length字节。如果map到此缓冲区的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建或自上次调用此方法以来对所选区域缓冲区所做的所有更改都已写入该设备.强制操作可以自由写入位于指定区域之外的字节,例如,以确保某些设备特定粒度的数据块被完整传输。
如果文件不驻留在本地设备上,则不提供此类保证。
如果此缓冲区未映射到读/写模式 (
FileChannel.MapMode.READ_WRITE),则调用此方法可能无效。特别是,该方法对以只读或私有映射模式映射的缓冲区没有影响。此方法可能会或可能不会影响特定于实现的映射模式。- 参数:
index- 缓冲区中要写回存储的第一个字节的索引;必须为非负且小于capacity()length- 以字节为单位的区域长度;必须为非负且不大于capacity() - index- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException- 如果索引和长度的先决条件不成立。UncheckedIOException- 如果发生 I/O 错误,将缓冲区的内容写入包含映射文件的存储设备- 自从:
- 13
-
position
设置此缓冲区的位置。如果标记已定义且大于新位置,则将其丢弃。 -
limit
设置此缓冲区的限制。如果位置大于新限制,则将其设置为新限制。如果标记已定义且大于新限制,则将其丢弃。 -
mark
在其位置设置此缓冲区的标记。 -
reset
将此缓冲区的位置重置为先前标记的位置。调用此方法既不会更改也不会丢弃标记的值。
-
clear
清除此缓冲区。位置设置为零,限制设置为容量,标记被丢弃。在使用一系列通道读取或之前调用此方法put填充此缓冲区的操作。例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
这种方法实际上并没有擦除缓冲区中的数据,但它的命名就好像它确实擦除一样,因为它最常用于可能是这种情况的情况。
-
flip
翻转此缓冲区。限制设置为当前位置,然后位置设置为零。如果标记已定义,则将其丢弃。经过一系列通道读取或put操作,调用此方法来准备一系列通道写入或相关get操作。例如:
buf.put(magic); // Prepend header in.read(buf); // Read data into rest of buffer buf.flip(); // Flip buffer out.write(buf); // Write header + data to channel
在将数据从一个地方传输到另一个地方时,该方法通常与
compact方法结合使用。 -
rewind
倒带此缓冲区。位置设置为零,标记被丢弃。在一系列通道写入或之前调用此方法get操作,假设已经适当地设置了限制。例如:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
-
slice
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数,其标记将未定义,其字节顺序将为
BIG_ENDIAN。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。通过在返回缓冲区上调用
load()将字节读入物理内存,或通过在返回缓冲区上调用force()将字节写入存储设备,只会作用于返回缓冲区代表的该缓冲区的子范围,即[position(),limit())。- 指定者:
slice在类ByteBuffer中- 返回:
- 新的字节缓冲区
- 参见:
-
slice
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从该缓冲区中的位置
index开始,并将包含length个元素。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。新缓冲区的位置将为零,其容量和限制将为
length,其标记将未定义,其字节顺序将为BIG_ENDIAN。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。通过在返回缓冲区上调用
load()将字节读入物理内存,或通过在返回缓冲区上调用force()将字节写入存储设备,将仅作用于返回缓冲区代表的此缓冲区的子范围,即[index,index+length),其中index和length被假定为满足先决条件。- 指定者:
slice在类ByteBuffer中- 参数:
index- 该缓冲区中新缓冲区内容开始的位置;必须为非负且不大于limit()length- 新缓冲区将包含的元素数;必须为非负且不大于limit() - index- 返回:
- 新缓冲区
-
duplicate
创建一个共享此缓冲区内容的新字节缓冲区。新缓冲区的内容将是该缓冲区的内容。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的容量、限制、位置和标记值将与该缓冲区的相同,其字节顺序将为
BIG_ENDIAN。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。- 指定者:
duplicate在类ByteBuffer中- 返回:
- 新的字节缓冲区
-
compact
压缩此缓冲区(可选操作).缓冲区的当前位置与其限制之间的字节(如果有)被复制到缓冲区的开头。即索引处的字节p=
position()被复制到索引零,索引处的字节p1 被复制到索引 1,依此类推,直到索引limit()- 1 处的字节被复制到索引nlimit()-1-p.缓冲区的位置然后设置为n+1个其限制设置为其容量。标记(如果已定义)将被丢弃。缓冲区的位置设置为复制的字节数,而不是零,因此调用此方法后可以立即调用另一个相关方法put方法。
在从缓冲区写入数据后调用此方法,以防写入不完整。例如,以下循环通过缓冲区
buf将字节从一个通道复制到另一个通道:buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }- 指定者:
compact在类ByteBuffer中- 返回:
- 这个缓冲区
-