2016-07-18 480 views
5

Esempio:Perché i due punti vengono sottoposti a escape con una barra rovesciata quando si genera un file di proprietà utilizzando l'API Java? Codice

public final class Test 
{ 
    public static void main(final String... args) 
     throws IOException 
    { 
     final Properties properties = new Properties(); 

     properties.setProperty("foo", "bar:baz"); 

     // Yeah, this supposes a Unix-like system 
     final Path path = Paths.get("/tmp/x.properties"); 

     try (
      // Requires Java 8! 
      final Writer writer = Files.newBufferedWriter(path); 
     ) { 
      properties.store(writer, null); 
     } 
    } 
} 

Ora, quando:

$ cat /tmp/x.properties 
# The date here 
foo=bar\:baz 

il colon è cavata con una barra inversa. In effetti, tutti i due punti sono.

La cosa strana è che se si genera un file di proprietà a mano e non "escape" i due punti, le proprietà vengono lette altrettanto bene.

Quindi, perché il processo di scrittura di Properties (questo è il caso se si utilizza un modo Writer o OutputStream) di escape in questo modo?

+0

Per riferimento: farà anche lo stesso per '=', ':', '#' e '!' ([Fonte] (http://grepcode.com/file/repository.grepcode.com/java /root/jdk/openjdk/6-b14/java/util/Properties.java#628)). –

+1

[Questa riga] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Properties.java#364) implica che c'è una differenza di comportamento se i due punti non sono sfuggiti. –

+0

Perché è specificato ciò che si verifica nella documentazione. – EJP

risposta

2

Il metodo della classe Propertiesload menzionare i seguenti:

La chiave contiene tutte le caratteri nella riga che iniziano con il primo carattere non-bianco e fino a, ma non incluso, il primo senza caratteri " = ',': ', o carattere di spazio bianco diverso da un terminatore di riga. Tutti questi caratteri di terminazione chiave possono essere inclusi nella chiave evadendoli con un carattere barra retroversa precedente;

...

Ad esempio, ciascuna delle seguenti tre righe specifica il tasto "verità" e il valore dell'elemento associato "Beauty":

Truth = Beauty

Truth:Beauty

Truth :Beauty

Quindi i due punti possono essere utilizzati per determinare la fine della chiave in un file di proprietà.

1

Poiché la sintassi del file delle proprietà consente di utilizzare i due punti come separatore tra chiavi e valori anziché un carattere uguale (è possibile utilizzare solo uno spazio), per evitare problemi se si modifica il separatore sfuggirli può essere una buona idea.

Ad esempio:

# Add spaces to the key 
key\ 2 = value for "key 2" 
# colon : 
key3: This is key 3 
#space 
key4 This is key 4 

È possibile controllare le altre opzioni nel wikipedia entry