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时会发生什么。