Файл: URI и Slashes

Приложение, над которым я работаю, включает в себя доступ к файлам в общих папках сети, и мы используем URI для указания местоположений файлов.

Мое понимание файла: URI заключается в том, что они должны иметь форму file:// + path. В случае общего сетевого ресурса Windows этот путь выглядит примерно как \\servername\dir\file, поэтому результирующий URI становится file:////servername/dir/file.

Кажется, он отлично работает для Java URI class, но API Win32, похоже, хочет URI стиля file://servername/dir/file, который Java отвергает потому что он "имеет компонент полномочий".

Я правильно понимаю URI сетевых ресурсов? Есть ли другой способ указать путь без Java, жалующийся на авторитет?

Изменить: Мы надеялись, что будем хранить пути как URI, чтобы использовать схему-часть URI для указания других местоположений (например, file: versus other:). Но, как указано, похоже, что Java может иметь свои собственные проблемы с URI...

Ответы

Ответ 1

Кажется, что Java ошибочна:

Неверно: file:////applib/products/a%2Db/abc%5F9/4148.920a/media/start.swf
Правильно: file://applib/products/a-b/abc_9/4148.920a/media/start.swf

В пути UNC в Java:

Класс URI обрабатывает пути UNC достаточно хорошо, но имеет некоторые проблемы. В библиотеках классов Java строковое представление UNC-пути выглядит следующим образом:

new File("//SERVER/some/path").toURI().toString()
                                                -> "file:////SERVER/some/path

Другими словами, URI хранит весь UNC-путь в компоненте пути URI и оставляет сервер/компонент полномочий пустым. Пока вы последовательно используете это строковое представление, вы сможете успешно взаимодействовать с java.net.URI.