java中的内存映射文件

java中的内存映射文件,java,nio,mmap,memory-mapped-files,Java,Nio,Mmap,Memory Mapped Files,我正在读这本书,它有以下几行: MemoryMappedBuffer直接反映它使用的磁盘文件 是关联的。如果在映射过程中对文件进行了结构修改 实际上,可能会产生奇怪的行为(例如,确切的行为) 当然,取决于操作系统和文件系统)。A. MemoryMappedBuffer具有固定大小,但其映射到的文件是 有弹力的特别是,如果在映射过程中文件大小发生更改 实际上,部分或全部缓冲区可能无法访问, 可以返回未定义的数据,也可以返回未检查的异常 扔 因此,我的问题是: 无法将文本附加到已映射的文件中。如果

我正在读这本书,它有以下几行:

MemoryMappedBuffer
直接反映它使用的磁盘文件 是关联的。如果在映射过程中对文件进行了结构修改 实际上,可能会产生奇怪的行为(例如,确切的行为) 当然,取决于操作系统和文件系统)。A.
MemoryMappedBuffer
具有固定大小,但其映射到的文件是 有弹力的特别是,如果在映射过程中文件大小发生更改 实际上,部分或全部缓冲区可能无法访问, 可以返回未定义的数据,也可以返回未检查的异常 扔

因此,我的问题是:

  • 无法将文本附加到已映射的文件中。如果是,那怎么办
  • 有人能告诉我什么是内存映射文件的实际使用情况吗?如果你能提到你通过这个解决了什么具体问题,那就太好了

如果这些问题很幼稚,请容忍我。谢谢

内存映射文件比常规ByteBuffer版本快得多,但它会分配整个内存。例如,如果您映射4MB文件,操作系统将在文件系统上创建4MB文件,该文件将映射到内存,您只需写入内存即可直接写入文件。当您确切地知道要写入的数据量时,这非常方便,因为如果您写入的数据少于指定的数据数组,那么数据数组的其余部分将用零填充。此外,Windows将锁定该文件(在JVM退出之前不能删除),Linux上不是这样

下面是使用内存映射缓冲区附加到文件的示例,例如,只需输入要写入的文件的文件大小:

int BUFFER_SIZE = 4 * 1024 * 1024; // 4MB
String mainPath = "C:\\temp.txt";
SeekableByteChannel dataFileChannel = Files.newByteChannel("C:\\temp.txt", EnumSet.of(StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.APPEND));
MappedByteBuffer writeBuffer = dataFileChannel.map(FileChannel.MapMode.READ_WRITE, FILE_SIZE, BUFFER_SIZE);
writeBuffer.write(arrayOfBytes);

1.是的,请看2。性能和内存消耗,使用旧io时,所有内核缓冲区数据都会复制到JVM并返回比NIO更慢且需要更多内存的数据。您不能使用内存映射文件进行追加,因为您必须事先声明映射大小。
map
javadoc说:“当请求的区域未完全包含在此通道的文件中时,此方法的行为未指定。”因此,不能按您描述的方式保存以使用内存映射。java.nio.channels.seekablebytechnel没有map()方法。请澄清或更新代码以便编译?