Файловые системы и пути NIO несовместимы с файловой системой по умолчанию
Я создаю Файловую Систему для просмотра фляги в случае, если доступ к моим ресурсам будет только в фляге.
Затем я заметил, что при создании новой файловой системы она фактически регистрируется как файловая система по умолчанию при использовании класса Paths NIO.
Но Filesystems.getDefaultSystem постоянно возвращает жесткий диск.
Почему это поведение противоречиво и так прозрачно? Как я могу запросить файловую систему, которую фактически использует Paths, когда запрашивается относительный путь как myResources/myResource.txt?
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)
2 ответа
Вы получили суть этого в своем ответе; Paths.get()
со строковыми аргументами на самом деле строго эквивалентно FileSystems.getDefault().getPath()
с одинаковыми строковыми аргументами.
Теперь, что касается URI, это зависит от зарегистрированных поставщиков файловой системы, и у поставщика файловой системы по умолчанию всегда есть схема file
, У провайдера файловой системы zip есть схема jar
,
Теперь, если вы укажете URI для зарегистрированного провайдера, провайдер может или не может создавать файловую систему для вас автоматически.
Обратите внимание, однако, что FileSystem
инвентарь Closeable
, следовательно AutoCloseable
; поэтому рекомендуется взять его в руки и получить от него пути, чтобы вы могли правильно закрыть его, когда закончите с ним. Если вы этого не сделаете, вы можете утечь ресурсы!
Хорошо, извини, я понял.
Paths.get (URI) и Paths.get (strPath) имеют разную механику. Первый однозначно загружает конкретную ФС, а второй использует всегда getDefault(), который, кажется, всегда является обычным диском.
Так что, если бы вы использовали Paths.get (strPath), то поведение было бы таким, как я ожидал, возвращая всегда ссылку на файловую систему диска, согласованную с getDefaultFilesystem(), независимо от того, что вы регистрировали ранее.