Подтвердить что ты не робот

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:.... Это нормальное поведение?


EDIT:

Из исходного кода Java: java.net.URLStreamHandler.toExternalForm(URL)

    result.append(":");
    if (u.getAuthority() != null && u.getAuthority().length() > 0) {
        result.append("//");
        result.append(u.getAuthority());
    }

Похоже, что часть авторизации URL-адреса файла является пустой или пустой, и поэтому двойная коса пропускается. Итак, какова часть полномочий URL-адреса и действительно ли она отсутствует в файловом протоколе?

4b9b3361

Ответ 1

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

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

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

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

RFC3986 (3.2.2. Host):

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

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

Ответ 3

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