Java 路径组件应为'/';

Java 路径组件应为'/';,java,path,filesystems,uri,Java,Path,Filesystems,Uri,我试图创建一个文件系统对象来保存一个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

我试图创建一个
文件系统
对象来保存一个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 */
}
我已将文件系统作为
文件
对象加载,并使用
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)

为什么不使用路径对象

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
静态文件系统newFileSystem(路径、类加载器)
构造一个新的文件系统以作为文件系统访问文件的内容。
静态文件系统newFileSystem(URI、映射环境)
构造一个由URI标识的新文件系统
静态文件系统newFileSystem(URI、映射环境、类加载器)
构造一个由URI标识的新文件系统

WindowsFileSystemProvider检查URI的路径是否仅为“/”。uri作为uri是完全有效的,问题在于文件系统的必要条件。crashystar是正确的(我还不能评论),应该使用路径。 如果您阅读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尝试定位已安装的提供程序(因此您不能期望使用自定义提供程序)。如果它是一个自定义提供程序,则必须使用能够加载该提供程序的类加载器。如果提供程序在您的类路径上,就足够了

getClass().getClassLoader()
既然你说你只想让操作系统这么做,就把它设为null。

你可以试试这个:

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

这在Windows上对我很有效。还没有在其他操作系统上测试过

 private void openZip(File runFile) throws IOException {
    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    env.put("encoding", "UTF-8");
    System.out.println(runFile.toURI());
    Files.deleteIfExists(runFile.toPath());
    zipfs = FileSystems.newFileSystem(URI.create("jar:" + runFile.toURI().toString()), env);
    //zipfs = FileSystems.newFileSystem(runFile.toPath(), getClass().getClassLoader()); //-----does not work 
    //zipfs = FileSystems.newFileSystem(URI.create("jar:file:/c:/Users/Siraj/Documents/AAAExport4.zip"), env);  //---works  
 }
private void openZip(File runFile)引发IOException{
Map env=new HashMap();
环境出售(“创建”、“真实”);
环境投入(“编码”、“UTF-8”);
System.out.println(runFile.toURI());
Files.deleteIfExists(runFile.toPath());
zipfs=FileSystems.newFileSystem(URI.create(“jar:+runFile.toURI().toString()),env);
//zipfs=FileSystems.newFileSystem(runFile.toPath(),getClass().getClassLoader());//----不工作
//zipfs=FileSystems.newFileSystem(URI.create(“jar:file:/c:/Users/Siraj/Documents/AAAExport4.zip”),env);//--works
}

您是否尝试过路径“/C:/…”前面的
文件://
(这是协议),从而使
file:///C:/...
?更改后,出现了完全相同的错误:(将
/
添加到URI的末尾怎么样?如果ext2是挂载点,我希望它后面需要一个路径,所以
文件:/C:/Users/Rosetta/workspace/filesystemProject/fs/ext2/
再次出现同样的错误。ext2是实际的文件系统映像。这很令人恼火!我一开始尝试了这个,但是我不知道
类加载器是什么>是或如何使用一个。我如何使用
类加载器
和第一个方法来获取
文件系统
?这就引出了一个问题,getFileSystem()和newFileSystem()之间的区别是什么?人们会认为newFileSystem()创建了一个全新的空白文件系统……否则,为什么要使用getFileSystem()呢?我发现这很有用,因为我的Uri用于提取jar文件。我不知道在普通文件夹上打开zipFileSystem时会发生什么。