我正在阅读book并且它有以下几行:
MemoryMappedBuffer
直接反映与之相关的磁盘文件 已关联的。如果在映射时对结构进行了修改 实际上,可能会导致奇怪的行为(确切的行为是, 当然,依赖于操作系统和文件系统)。一个MemoryMappedBuffer
具有固定大小,但它映射到的文件是 弹性。具体来说,如果文件的大小在映射时发生变化 实际上,部分或全部缓冲区可能无法访问, 可以返回未定义的数据,也可以返回未经检查的异常 抛出。
所以我的问题是:
如果问题非常幼稚,请耐心等待。谢谢。
答案 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);