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
;因此建议您抓住它,并从中获取路径,以便您在完成后可以正确地关闭它。如果不这样做,您可能会泄漏资源!
我正在创建一个文件系统来浏览 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
;因此建议您抓住它,并从中获取路径,以便您在完成后可以正确地关闭它。如果不这样做,您可能会泄漏资源!