路径组件应为“/”

2022-09-02 10:07:39

我正在尝试创建一个对象来保存ext2文件系统。我的似乎无效,给我一个路径组件应该是'/'运行时错误。FileSystemURI

我正在使用Windows,并将我的项目放在Eclipse中,其中包含一个名为“fs”的子目录,用于保存文件系统映像。

我的代码...

URI uri = URI.create("file:/C:/Users/Rosetta/workspace/filesystemProject/fs/ext2");
/* uri holds the path to the ext2 file system itself */         

try {
    FileSystem ext2fs = FileSystems.newFileSystem(uri, null);
} catch (IOException ioe) {
    /* ... code */
}

我已经将文件系统作为一个对象加载,并使用该方法来确保我的文件系统与实际的相同,并且确实如此。FilegetURIURIURI

如何加载文件系统?

编辑:

下面的堆栈跟踪

Exception in thread "main" java.lang.IllegalArgumentException: Path component should be '/'
    at sun.nio.fs.WindowsFileSystemProvider.checkUri(Unknown Source)
    at sun.nio.fs.WindowsFileSystemProvider.newFileSystem(Unknown Source)
    at java.nio.file.FileSystems.newFileSystem(Unknown Source)
    at java.nio.file.FileSystems.newFileSystem(Unknown Source)

答案 1

WindowsFileSystemProvider 检查 URI 的路径是否只有“/”。URI作为URI是完全有效的,问题是文件系统的必要条件。crashystar有它的权利(我还不能评论),应该使用Path。如果你阅读newFileSystem(Path,ClassLoader)的JavaDoc,你会看到ClassLoader可以保留为null,所以你只需要做

Path path = Paths.get("C:/Users/Rosetta/workspace/filesystemProject/fs/ext2");
FileSystem ext2fs = FileSystems.newFileSystem(path, null);

通过将其保留为空,Java会尝试找到已安装的提供程序(因此您不能期望使用自定义提供程序)。如果它是一个自定义提供程序,则必须使用可以加载该提供程序的 ClassLoader。如果提供程序在您的类路径上,则只需执行该操作即可

getClass().getClassLoader()

既然你说你只是希望操作系统这样做,那就把它保留为空。


答案 2

为什么不使用 Path 对象?

newFileSystem(Path path, ClassLoader loader)
Constructs a new FileSystem to access the contents of a file as a file system.

请注意三个构造函数:

static FileSystem   newFileSystem(Path path, ClassLoader loader)
Constructs a new FileSystem to access the contents of a file as a file system.

static FileSystem   newFileSystem(URI uri, Map<String,?> env)
Constructs a new file system that is identified by a URI

static FileSystem   newFileSystem(URI uri, Map<String,?> env, ClassLoader loader)
Constructs a new file system that is identified by a URI

推荐