example java url uri filepath file-uri

example - Java: File.toURI(). ToURL() en un archivo de Windows



url java (3)

El sistema que estoy ejecutando es Windows XP, con JRE 1.6.

Hago esto :

public static void main(String[] args) { try { System.out.println(new File("C://test a.xml").toURI().toURL()); } catch (Exception e) { e.printStackTrace(); } }

y obtengo esto: file:/C:/test%20a.xml

¿Cómo es que la URL dada no tiene dos barras inclinadas antes de la C: :? Esperaba el file://C:... ¿Es el comportamiento normal?

EDITAR:

Desde el código fuente de Java: java.net.URLStreamHandler.toExternalForm (URL)

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

Parece que la parte de Autoridad de la URL de un archivo es nula o está vacía y, por lo tanto, se omite la barra doble. Entonces, ¿cuál es la parte de autoridad de una URL y está realmente ausente del protocolo de archivo?


En lo que respecta a su uso en un navegador, no importa. Normalmente he visto el file:///... pero uno, dos o tres ''/'' funcionarán todos. Esto me hace pensar (sin mirar la documentación de Java) que sería un comportamiento normal.


Esa es una pregunta interesante.

Lo primero es lo primero: obtengo los mismos resultados en JRE6. Incluso lo consigo cuando corto la parte toURL ().

RFC2396 realidad no requiere dos barras diagonales. Según la sección 3:

La sintaxis URI depende del esquema. En general, los URI absolutos se escriben de la siguiente manera:

<scheme>:<scheme-specific-part>

Dicho esto, RFC2396 ha sido reemplazado por RFC3986 , que establece que

La sintaxis de URI genérica consiste en una secuencia jerárquica de omponentes denominada esquema, autoridad, ruta, consulta y fragmento.

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty

Los componentes del esquema y la ruta son necesarios, aunque la ruta puede estar vacía (sin caracteres). Cuando la autoridad está presente, la ruta debe estar vacía o comenzar con un carácter de barra ("/"). Cuando la autoridad no está presente, la ruta no puede comenzar con dos caracteres de barra ("//"). Estas restricciones dan como resultado cinco reglas ABNF diferentes para una ruta (Sección 3.3), solo una de las cuales coincidirá con cualquier referencia URI dada.

Ahí vas. Como los URI de archivo no tienen un segmento de autoridad, tienen prohibido comenzar con //.

Sin embargo, ese RFC no apareció hasta 2005 y Java hace referencia al RFC2396, así que no sé por qué sigue esta convención, ya que las URL de los archivos antes del nuevo RFC siempre han tenido dos barras diagonales.


Para responder por qué puede tener ambos:

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

RFC3986 (3.2.2. Host) establece:

"Si el esquema de URI define un valor predeterminado para el host, entonces ese valor predeterminado se aplica cuando el subcomponente de host no está definido o cuando el nombre registrado está vacío (longitud cero). Por ejemplo, el esquema de URI" archivo "se define de modo que ninguna autoridad, una el host vacío y "localhost" significan la máquina del usuario final, mientras que el esquema "http" considera que una autoridad faltante o un host vacío no son válidos ".

Por lo tanto, el esquema "archivo" traduce el file:///path/file para tener un contexto de la máquina del usuario final a pesar de que la autoridad es un host vacío.