NIO 的文件系统和路径与默认文件系统不一致

NIO's Filesystems and Paths inconsistent about default FileSystem

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

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

但是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)

好的,抱歉我知道了。

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

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

你的回答已经抓住要点了;带有字符串参数的 Paths.get() 实际上严格等同于带有相同字符串参数的 FileSystems.getDefault().getPath()

现在,关于 URI,它取决于注册的文件系统提供者,默认的文件系统提供者总是有方案 file。 zip 文件系统提供程序具有方案 jar.

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

但是请注意,FileSystem 实现了 Closeable,因此 AutoCloseable;因此建议您抓住它,并从中获取路径,以便您在完成后可以正确地关闭它。如果不这样做,您可能会泄漏资源!