路径组件应为'/'

时间:2014-11-22 15:22:48

标签: java path filesystems uri

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

我正在使用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 */
}

我已将文件系统加载为File对象,并使用getURI方法确保我的URI与实际的URI相同,而且确实如此。

如何加载文件系统?

编辑:

下面的堆栈跟踪

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)

3 个答案:

答案 0 :(得分:6)

WindowsFileSystemProvider检查URI的路径是否只是'/'。 uri作为URI完全有效,问题是FileSystem的必需品。 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);

将其保留为null Java尝试查找已安装的提供程序(因此您不能指望使用自定义提供程序)。如果它是自定义提供程序,则必须使用可以加载该提供程序的ClassLoader。如果提供者在您的类路径上,那就足够了

getClass().getClassLoader()

由于您说您只想让操作系统执行此操作,请将其保留为空。

答案 1 :(得分:4)

为什么不使用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

答案 2 :(得分:1)

你可以试试这个:

URI uri = URI.create("jar:file:/C:/Users/Rosetta/workspace/filesystemProject/fs/ext2");