Java: File.toURI(). ToURL() в файле Windows
Система, на которой я работаю - Windows XP с JRE 1.6.
Я сделаю это:
public static void main(String[] args) {
try {
System.out.println(new File("C:\\test a.xml").toURI().toURL());
} catch (Exception e) {
e.printStackTrace();
}
}
и я получаю это: file:/C:/test%20a.xml
Почему у данного URL нет двух косых черт перед C:
? Я ожидал file://C:...
, Это нормальное поведение?
РЕДАКТИРОВАТЬ:
Из исходного кода Java: java.net.URLStreamHandler.toExternalForm(URL)
result.append(":");
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
result.append("//");
result.append(u.getAuthority());
}
Кажется, что часть Authority URL файла пуста или пуста, и поэтому двойная косая черта пропускается. Итак, что такое авторитетная часть URL и действительно ли она отсутствует в файловом протоколе?
3 ответа
Это интересный вопрос.
Перво-наперво: я получаю те же результаты на JRE6. Я даже получаю это, когда отрываю часть toURL().
RFC2396 на самом деле не требует двух слешей. Согласно разделу 3:
Синтаксис URI зависит от схемы. В общем, абсолютный URI записывается следующим образом:
<scheme>:<scheme-specific-part>
Сказав это, RFC2396 был заменен RFC3986, который заявляет
Общий синтаксис URI состоит из иерархической последовательности компонентов, называемых схемой, полномочием, путем, запросом и фрагментом.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
Компоненты схемы и пути являются обязательными, хотя путь может быть пустым (без символов). При наличии прав доступа путь должен быть либо пустым, либо начинаться с символа косой черты ("/"). Когда права доступа отсутствуют, путь не может начинаться с двух символов косой черты ("//"). Эти ограничения приводят к пяти различным правилам ABNF для пути (раздел 3.3), только одно из которых будет соответствовать любой заданной ссылке на URI.
Итак, поехали. Поскольку файловые URI не имеют сегмента полномочий, им запрещено начинать с //.
Однако этот RFC появился только в 2005 году, а Java ссылается на RFC2396, поэтому я не знаю, почему он следует этому соглашению, поскольку URL-адреса файлов до нового RFC всегда имели две косые черты.
Чтобы ответить, почему вы можете иметь оба:
file:/path/file
file:///path/file
file://localhost/path/file
RFC3986 (3.2.2. Host) заявляет:
"Если схема URI определяет значение по умолчанию для хоста, то это значение применяется по умолчанию, когда подкомпонент хоста не определен или когда зарегистрированное имя пусто (нулевая длина). Например, схема URI" файл "определяется так, что нет полномочий, пустой хост и localhost означают компьютер конечного пользователя, тогда как схема http считает отсутствующие права доступа или пустой хост недействительными.
Таким образом, схема "файл" переводит file:///path/file
иметь контекст машины конечного пользователя, даже если полномочия являются пустым хостом.
Что касается использования его в браузере, это не имеет значения. Я обычно видел file:///...
но один, два или три '/' будут работать. Это заставляет меня думать (не глядя на документацию Java), что это было бы нормальное поведение.