将文件系统条目加载到内存映射文件 (NIO2) 的最快最干净的方法
Fastest and cleanest way to load a FileSystem entry into a memory-mapped file (NIO2)
我想将 zip/jar 条目提取到内存中,这样我就可以关闭 zip stream/FS 并将文件保留在 JVM 中,而无需处理临时副本。
一个选项是使用 Files.readAllLines(Path pathToZipFSentry),但它似乎使用了缓冲的 reader,这对大文件有很大的不利影响。
所以我正在研究如何在 Java NIO2 中做到这一点,似乎方法是通过 FileChannels 以 MappedByteBuffer 结束。
我无法使用 RandomAccessFile.getChannel(),因为我来自虚拟文件系统的路径,而不是文字文件。
我不能使用 Files.newByteChannel(rscPath, StandardOpenOption.READ) 然后 (fileChannel.)map() 因为它 returns 一个在界面中没有地图的 SeekableByteChannel...
是否有任何 one/two 通过 Java8 中的 Path(s)/File(s)/FileSystem(s)/FileChannel(s) 实现的高级衬垫?我希望像 InMemoryFile file = Files.loadIntoMem(Path) 这样的东西我已经花了 1 个小时寻找关闭选项...
你不能真正将其直接加载到内存中。
您确实有 FileChannel.open()
,然后您可以从中 .map()
但无论如何这都会在您的磁盘上创建一个临时条目。
还有 memoryfilesystem,但不幸的是,它无法处理大到无法使用的文件。
我看到的最佳解决方案是 Files.copy()
到一个临时文件和 mmap() 那个;然后在完成修改后复制回 zip 文件。
但基本上,这就是您已经在做的,所以...
我想将 zip/jar 条目提取到内存中,这样我就可以关闭 zip stream/FS 并将文件保留在 JVM 中,而无需处理临时副本。
一个选项是使用 Files.readAllLines(Path pathToZipFSentry),但它似乎使用了缓冲的 reader,这对大文件有很大的不利影响。
所以我正在研究如何在 Java NIO2 中做到这一点,似乎方法是通过 FileChannels 以 MappedByteBuffer 结束。
我无法使用 RandomAccessFile.getChannel(),因为我来自虚拟文件系统的路径,而不是文字文件。 我不能使用 Files.newByteChannel(rscPath, StandardOpenOption.READ) 然后 (fileChannel.)map() 因为它 returns 一个在界面中没有地图的 SeekableByteChannel...
是否有任何 one/two 通过 Java8 中的 Path(s)/File(s)/FileSystem(s)/FileChannel(s) 实现的高级衬垫?我希望像 InMemoryFile file = Files.loadIntoMem(Path) 这样的东西我已经花了 1 个小时寻找关闭选项...
你不能真正将其直接加载到内存中。
您确实有 FileChannel.open()
,然后您可以从中 .map()
但无论如何这都会在您的磁盘上创建一个临时条目。
还有 memoryfilesystem,但不幸的是,它无法处理大到无法使用的文件。
我看到的最佳解决方案是 Files.copy()
到一个临时文件和 mmap() 那个;然后在完成修改后复制回 zip 文件。
但基本上,这就是您已经在做的,所以...