byte[] Files.readAllBytes() 和 FileChannels.map (ByteBuffer/MappedByteBuffer) 的区别

Difference between byte[] Files.readAllBytes(), and FileChannels.map (ByteBuffer/MappedByteBuffer)

我看到了各种基准测试和关于分配的 direct/non-direct 字节缓冲区解释,但我没有找到关于在这些方法上使用内存字节时的区别的简单解释。

有人可以解释一下吗?应该不难分辨出它们的不同之处。

谢谢!

你的问题并没有真正说明你想要什么样的区别,但两者的文档都非常简单:

Files.readAllBytes(): http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes(java.nio.file.Path)

FileChannel.map: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map(java.nio.channels.FileChannel.MapMode,%20long,%20long)

readAllBytes 将文件的全部内容复制到新的堆上字节数组中,而将文件映射到 ByteBuffer 允许访问文件的字节,而无需一次将其全部加载到内存中。您应该期望从映射字节缓冲区访问字节会产生一些性能开销,但另一方面,您可以映射不适合 RAM 的大文件。