Java: File.toURI (). ToURL () в файле Windows - PullRequest
16 голосов
/ 15 июля 2009

Система, на которой я работаю - 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 ]

12 голосов
/ 15 июля 2009

Это интересный вопрос.

Перво-наперво: я получаю те же результаты на 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 всегда имели две косые черты.

2 голосов
/ 22 января 2012

Чтобы ответить, почему вы можете иметь оба:

file:/path/file
file:///path/file
file://localhost/path/file

RFC3986 (3.2.2. Host) состояния:

"Если схема URI определяет значение по умолчанию для хоста, то это значение по умолчанию применяется, когда подкомпонент хоста не определен или когда зарегистрированное имя пусто (нулевая длина). Например, схема URI" file "определяется так, что нет полномочия, пустой хост и «localhost» означают компьютер конечного пользователя, тогда как схема «http» считает отсутствующий авторитет или пустой хост недействительным. "

Таким образом, «файловая» схема переводит file:///path/file в контекст конечного пользователя, даже если права доступа - это пустой хост.

1 голос
/ 15 июля 2009

Что касается использования его в браузере, это не имеет значения. Я обычно видел file:///..., но один, два или три '/' будут работать. Это заставляет меня думать (не глядя на документацию Java), что это было бы нормальное поведение.

...