0

我正在创建一个文件系统来浏览 jar,以防对我的资源的访问是在一个 jar 中。

然后我注意到,在创建一个新的 FileSystem 时,它实际上在使用 Paths NIO 类时注册为默认文件系统。

但 Filesystems.getDefaultSystem 不断返回硬盘常规。

为什么这种行为不一致且如此透明?当询问相对路径为 myResources/myResource.txt 时,如何询问 Paths 实际使用的文件系统?

  System.out.println("Default FS: "+FileSystems.getDefault().getClass().getName());

  URI rscURI = Test.class.getClassLoader().getResource("folder").toURI();

  try{ Paths.get(clURI).getFileSystem(); } 
  catch(FileSystemNotFoundException e){
        System.out.println("A new Filesystem for "+clURI.getScheme()+" scheme is created.");
        FileSystems.newFileSystem(clURI, Collections.emptyMap());
        System.out.println("Default FS: "+FileSystems.getDefault().getClass().getName());

 }
 return Paths.get(rscURI)
4

2 回答 2

1

您的答案中得到了要点;Paths.get()with 字符串参数实际上严格等同于FileSystems.getDefault().getPath()使用相同的字符串参数。

现在,对于 URI,它依赖于注册的文件系统提供者,并且默认的文件系统提供者总是有 scheme file。zip 文件系统提供程序具有 scheme jar

现在,如果您为已注册的提供者指定 URI,则提供者可能会也可能不会自动为您创建文件系统。

FileSystem但是请注意Closeable,因此AutoCloseable;因此,建议您抓住它,并从中获取路径,以便在完成后正确关闭它。否则,您可能会泄漏资源!

于 2015-02-14T12:19:11.850 回答
0

好的,对不起,我明白了。

Paths.get(URI) 和 Paths.get(strPath) 有不同的机制。第一个明确加载特定的 FS,而第二个总是使用 getDefault() ,这似乎总是磁盘常规的。

因此,如果使用 Paths.get(strPath),那么行为将如我所料,始终返回对磁盘文件系统的引用,与 getDefaultFilesystem() 一致,无论您之前注册了什么。

于 2015-02-14T12:06:42.790 回答