Link 内存文件系统到 Java 中的普通文件系统

Link MemoryFileSystem to Normal FileSystem in Java

我有一个由 MemoryFileSystem 生成的文件系统。我想在真实文件系统中有一个文件夹 "maps" 到内存文件系统中的文件夹,因此在其中任何一个中创建的任何文件都只是真正写入内存而不是磁盘。在谈论这样的事情时,我听说过 "Symlink" 这个词,但我不完全确定这是否是我想要做的。有没有有效的方法来完成这个?

我试过 Files.createSymbolicLink(memoryRootPath, realFolderPath); 但这给了我这个错误:

Exception in thread "main" java.nio.file.ProviderMismatchException: expected a path of provider memory but got file

谢谢!

首先,您试图以错误的方向创建符号链接。如果你想让真实文件系统中的文件"mapped"指向内存文件系统,那么符号链接应该在指向内存文件系统的真实文件系统中。

但这是不可能的。

真正的文件系统是由操作系统实现的,它对内存文件系统一无所知。这意味着 OS 将无法解析符号链接。符号链接(在实际文件系统中)必须引用 OS 知道的文件系统中的内容。

如果你想实现这样的东西,它需要用 OS 理解的文件系统来完成。例如,在 Linux 上,您可以创建一个 "tmpfs" 文件系统,该文件系统由内存/虚拟内存支持。然后,您可以将其挂载到常规目录,并从常规文件系统创建符号链接,指向 tempfs 中的文件或目录。当您重新启动系统时,tempfs 将被破坏。


您遇到该异常的原因是 MemoryFileSystem 的实施限制。这是设计使然。

private AbstractPath castPath(Path path) {
    if (!(path instanceof AbstractPath)) {
        throw new ProviderMismatchException("expected a path of provider " +
            SCHEME + " but got " + path.getFileSystem().provider().getScheme());
    }
    return (AbstractPath) path;
}

理论上应该可以使从 MemoryFileSystem 到真实文件系统的符号链接起作用,但是:

  • 您需要分叉 MemoryFileSystem,并且
  • 我不认为它会做你想做的事。