【问题标题】:Error when using FileSystems.newFileSystem(URI uri, Map<String, ?> env)使用 FileSystems.newFileSystem(URI uri, Map<String, ?> env) 时出错
【发布时间】:2017-09-17 17:06:55
【问题描述】:

我正在使用以下代码:

private static FileSystem createZipFileSystem(String zipFileName, boolean create) throws IOException {
    final Path path = Paths.get(zipFileName);
    final URI uri = URI.create("file:" + path.toUri().getPath());
    final Map<String,String> env = new HashMap<String,String>();

    if(create) {
        env.put("create", "true");
    }

    return FileSystems.newFileSystem(uri, env);
}

当我调用它时(dest 是我项目中的一个文件夹):

createZipFileSystem("dest", true);

我收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Path component should be '/'
at sun.nio.fs.UnixFileSystemProvider.checkUri(UnixFileSystemProvider.java:77)
at sun.nio.fs.UnixFileSystemProvider.newFileSystem(UnixFileSystemProvider.java:86)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
at com.jerney.ziptest.utils.ZipNIO.createZipFileSystem(ZipNIO.java:19)
at com.jerney.ziptest.utils.ZipNIO.getFileSystem(ZipNIO.java:23)
at com.jerney.ziptest.App.main(App.java:15)

我尝试在 URI.create() 方法中使用“jar:file:”、“file:/”和“file://”,并尝试在末尾添加“/”的“dest”,但我每次都得到相同的结果。我在 SO 上看到了另一种解决方案,建议使用不同的 FileSystems 工厂方法,但我特别想使用这个构造函数,并且知道为什么这对我不起作用。

【问题讨论】:

  • 你能打印path.toUri().getPath()吗?
  • file:/valid/path/to/dest/
  • 所以"file:" + "file:///valid/path/to/dest/"你觉得它合乎逻辑吗?
  • 你为什么要创建这样的URIfinal URI uri = URI.create("file:" + path.toUri().getPath());final URI uri = path.toUri(); 应该足够了?
  • @ThomasKläger,你说得对,它有点迂回,但我检查了你的建议,结果是一样的

标签: java io path uri nio


【解决方案1】:

每个FileSystemProvider 都有自己的URI 前缀。如果您使用 file: 前缀,您实际上是在请求默认的 FileSystemProvider(取决于您的机器,sun.nio.fs.UnixFileSystemProvidersun.nio.fs.WindowsFileSystemProvider 的实例)。

如果你想使用ZipFileSystemProvider,你需要一个jar:前缀:

private static FileSystem createZipFileSystem(String zipFileName, boolean create) throws IOException {
    final Path path = Paths.get(zipFileName);
    final URI uri = URI.create("jar:" + path.toUri());
    final Map<String,String> env = new HashMap<String,String>();

    if(create) {
        env.put("create", "true");
    }

    return FileSystems.newFileSystem(uri, env);
}

【讨论】:

猜你喜欢
  • 2021-09-17
  • 2023-04-02
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2022-01-12
  • 2012-08-15
  • 2014-08-18
  • 1970-01-01
相关资源
最近更新 更多