- java.lang.Object
-
- java.nio.Buffer
-
- java.nio.ByteBuffer
-
- java.nio.MappedByteBuffer
-
- All Implemented Interfaces:
-
Comparable<ByteBuffer>
public abstract class MappedByteBuffer extends ByteBuffer
直接字节缓冲器,其内容是文件的存储器映射区域。映射的字节缓冲区是通过
FileChannel.map
方法创建的。 该类使用特定于内存映射文件区域的操作来扩展ByteBuffer
类。映射字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前保持有效。
映射字节缓冲区的内容可以随时更改,例如,如果该程序或其他映射文件的对应区域的内容被更改。 这种变化是否发生,何时发生,是操作系统依赖的,因此是未指定的。
映射字节缓冲区的全部或部分可能在任何时候变得无法访问,例如映射文件被截断。 访问映射字节缓冲区的不可访问区域的尝试不会更改缓冲区的内容,并将导致在访问时或稍后的时候抛出未指定的异常。 因此,强烈建议您采取适当的预防措施,以避免该程序或同时运行的程序对映射文件进行操作,但读取或写入文件的内容除外。
映射的字节缓冲区的行为与普通的直接字节缓冲区不同。
- 从以下版本开始:
- 1.4
-
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 MappedByteBuffer
clear()
清除此缓冲区。MappedByteBuffer
flip()
翻转这个缓冲区。MappedByteBuffer
force()
强制将此缓冲区内容的任何更改写入包含映射文件的存储设备。boolean
isLoaded()
告诉这个缓冲区的内容是否驻留在物理内存中。MappedByteBuffer
limit(int newLimit)
设置此缓冲区的限制。MappedByteBuffer
load()
将此缓冲区的内容加载到物理内存中。MappedByteBuffer
mark()
将此缓冲区的标记设置在其位置。MappedByteBuffer
position(int newPosition)
设置这个缓冲区的位置。MappedByteBuffer
reset()
将此缓冲区的位置重置为先前标记的位置。MappedByteBuffer
rewind()
倒带这个缓冲区。-
Methods inherited from class java.nio.Buffer
capacity, hasRemaining, isReadOnly, limit, position, remaining
-
Methods inherited from class java.nio.ByteBuffer
alignedSlice, alignmentOffset, allocate, allocateDirect, array, arrayOffset, asCharBuffer, asDoubleBuffer, asFloatBuffer, asIntBuffer, asLongBuffer, asReadOnlyBuffer, asShortBuffer, compact, compareTo, duplicate, equals, get, get, get, get, getChar, getChar, getDouble, getDouble, getFloat, getFloat, getInt, getInt, getLong, getLong, getShort, getShort, hasArray, hashCode, isDirect, order, order, put, put, put, put, put, putChar, putChar, putDouble, putDouble, putFloat, putFloat, putInt, putInt, putLong, putLong, putShort, putShort, slice, toString, wrap, wrap
-
-
-
-
方法详细信息
-
isLoaded
public final boolean isLoaded()
告诉这个缓冲区的内容是否驻留在物理内存中。返回值为
true
意味着该缓冲区中的所有数据很可能驻留在物理内存中,因此可能会被访问,而不会导致任何虚拟内存页面错误或I / O操作。 返回值为false
不一定意味着缓冲区的内容不驻留在物理内存中。返回的值是一个提示,而不是一个保证,因为底层操作系统可能会在调用此方法时返回一些缓冲区的数据。
- 结果
-
true
如果这个缓冲区的内容很可能驻留在物理内存中
-
load
public final MappedByteBuffer load()
将此缓冲区的内容加载到物理内存中。这种方法尽最大努力确保当它返回时,该缓冲区的内容驻留在物理内存中。 调用此方法可能会导致一些页面错误和I / O操作发生。
- 结果
- 这个缓冲区
-
force
public final MappedByteBuffer force()
强制将此缓冲区内容的任何更改写入包含映射文件的存储设备。如果映射到此缓冲区的文件驻留在本地存储设备上,那么当此方法返回时,将保证自从创建缓冲区以来所做的所有更改,或自上次调用该方法后,都将被写入该设备。
如果文件不在本地设备上,则不会提供此类保证。
如果此缓冲区未以读/写模式映射(
FileChannel.MapMode.READ_WRITE
),则调用此方法将不起作用。- 结果
- 这个缓冲区
-
position
public final MappedByteBuffer position(int newPosition)
设置这个缓冲区的位置。 如果标记被定义并且大于新位置,则它被丢弃。- 重写:
-
position
在ByteBuffer
- 参数
-
newPosition
- 新的位置值 必须是非负数,不得大于当前限制 - 结果
- 这个缓冲区
-
limit
public final MappedByteBuffer limit(int newLimit)
设置此缓冲区的限制。 如果位置大于新的限制,那么它被设置为新的限制。 如果标记被定义并且大于新限制,则它被丢弃。- 重写:
-
limit
在ByteBuffer
- 参数
-
newLimit
- 新限制值; 必须是非负数,不大于此缓冲区的容量 - 结果
- 这个缓冲区
-
mark
public final MappedByteBuffer mark()
将此缓冲区的标记设置在其位置。- 重写:
-
mark
在ByteBuffer
- 结果
- 这个缓冲区
-
reset
public final MappedByteBuffer reset()
将此缓冲区的位置重置为先前标记的位置。调用此方法既不会更改也不丢弃该标记的值。
- 重写:
-
reset
在ByteBuffer
- 结果
- 这个缓冲区
-
clear
public final MappedByteBuffer clear()
清除此缓冲区。 位置设置为零,限制设置为容量,标记被丢弃。在使用一系列通道读取或放置操作填充此缓冲区之前调用此方法。 例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
该方法实际上并不会清除缓冲区中的数据,而是将其命名为它的确因为它最常用于情况也是如此。
- 重写:
-
clear
在ByteBuffer
- 结果
- 这个缓冲区
-
flip
public final MappedByteBuffer flip()
翻转这个缓冲区。 该限制设置为当前位置,然后将该位置设置为零。 如果标记被定义,则它被丢弃。在通道读取或放置操作的序列之后,调用此方法来准备一系列通道写入或相对获取操作。 例如:
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
- 重写:
-
flip
在ByteBuffer
- 结果
- 这个缓冲区
-
rewind
public final MappedByteBuffer rewind()
倒带这个缓冲区。 位置设置为零,标记被丢弃。在通道写入或获取操作的序列之前调用此方法,假设已经设置了相应的限制。 例如:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
- 重写:
-
rewind
在ByteBuffer
- 结果
- 这个缓冲区
-
-