Java:. File.toURI () toURL () su file di Windows
Domanda
Il sistema che sto in esecuzione su Windows XP è, con JRE 1.6.
faccio questo:
public static void main(String[] args) {
try {
System.out.println(new File("C:\\test a.xml").toURI().toURL());
} catch (Exception e) {
e.printStackTrace();
}
}
e ottengo questo: file:/C:/test%20a.xml
Come mai l'URL dato non ha due barre prima della C:
? Mi aspettavo file://C:...
. E 'un comportamento normale?
Modifica
Da codice sorgente di Java: java.net.URLStreamHandler.toExternalForm (URL)
result.append(":");
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
result.append("//");
result.append(u.getAuthority());
}
Sembra che la parte dell'Autorità di un URL file è nullo o vuoto, e quindi la doppia barra viene saltata. Allora, qual è la parte autorità di un URL e è davvero assente dal protocollo di file?
Soluzione
Questa è una domanda interessante.
Per prima cosa: io ottengono gli stessi risultati su JRE6. Ho anche capito che quando ho LOP fuori la parte toURL ().
RFC2396 in realtà non richiede due barre. Secondo la sezione 3:
La sintassi URI dipende dalla schema. In generale, sono URI assoluto scritto come segue:
<scheme>:<scheme-specific-part>
Detto questo, RFC2396 è stato sostituito da RFC3986 , in cui si afferma
La sintassi URI generica è costituito da una sequenza gerarchica di omponenti denominato schema, l'autorità, percorso, query e frammento.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
I componenti schema e il percorso sono richiesto, anche se il percorso può essere vuoto (nessun carattere). Quando l'autorità è Attualmente, il percorso deve essere o vuoto o iniziare con una barra ( "/") carattere. Quando l'autorità non è presente, il percorso non può iniziare con due barra personaggi ("//"). queste restrizioni risultato in cinque diverse regole ABNF per un percorso (Sezione 3.3), solo uno di che corrisponderà un determinato URI di riferimento.
Quindi, ci si va. Dal momento che gli URI file hanno nessun segmento autorità, che stanno proibito a partire //.
Tuttavia, questo RFC non è venuto in giro fino al 2005, e Java fa riferimento RFC2396, quindi non so perché è seguendo questa convenzione, come gli URL dei file prima che il nuovo RFC hanno sempre avuto due barre.
Altri suggerimenti
Per rispondere a questo che si può avere sia:
file:/path/file
file:///path/file
file://localhost/path/file
RFC3986 (. 3.2.2 Host) afferma:
"Se lo schema URI definisce un predefinito per l'host, allora predefinito applica quando il sottocomponente host è definito o quando il nome registrato è vuota (lunghezza zero). Ad esempio, il '' schema URI file sia definita in modo che nessun autorità, un host vuoto, e "localhost" tutta la media macchina del l'utente finale, mentre il sistema di "http" considera un'autorità mancante o un host vuota non valida ".
Quindi, lo schema di "file" si traduce file:///path/file
di avere un contesto di macchina dell'utente finale, anche se l'autorità è un host vuota.
Per quanto riguarda come usarlo in un browser è interessato, non importa. Ho tipicamente visto file:///...
ma uno, due o tre '/' tutto il lavoro. Questo mi fa pensare (senza guardare la documentazione Java) che sarebbe stato un comportamento normale.