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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top