java中的内存映射文件

时间:2013-12-22 00:16:30

标签: java nio mmap memory-mapped-files

我正在阅读book并且它有以下几行:

  

MemoryMappedBuffer直接反映与之相关的磁盘文件   已关联的。如果在映射时对结构进行了修改   实际上,可能会导致奇怪的行为(确切的行为是,   当然,依赖于操作系统和文件系统)。一个   MemoryMappedBuffer具有固定大小,但它映射到的文件是   弹性。具体来说,如果文件的大小在映射时发生变化   实际上,部分或全部缓冲区可能无法访问,   可以返回未定义的数据,也可以返回未经检查的异常   抛出。

所以我的问题是:

  • 无法将文字附加到我已映射的文件中。如果是,那么如何?
  • 有人可以指导一下内存映射文件的真实用例,如果你能提一下你解决了哪些具体问题,那就太棒了。

如果问题非常幼稚,请耐心等待。谢谢。

1 个答案:

答案 0 :(得分:1)

内存映射文件比常规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);