Файловые системы и пути 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(), независимо от того, что вы регистрировали ранее.

Другие вопросы по тегам