2016-07-18 4 views
5

Próbka:Dlaczego dwukropki są ujęte z odwrotnym ukośnikiem podczas generowania pliku właściwości za pomocą interfejsu API Java? Kod

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); 
     } 
    } 
} 

Teraz, kiedy:

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

dwukropek jest uciekł z odwrotnym ukośnikiem. W rzeczywistości wszystkie są dwukropkami.

Dziwne jest to, że jeśli wygeneruję plik właściwości ręcznie i , nie "" ucieknie dwukropek, właściwości są również czytane.

Dlaczego więc proces pisania Properties (tak czy inaczej przy okazji używasz Writer lub OutputStream) w ten sposób unikasz dwukropków?

+0

Dla odniesienia: zrobi to samo dla '=', ':', '#' i '!' ([Źródło] (http://grepcode.com/file/repository.grepcode.com/java /root/jdk/openjdk/6-b14/java/util/Properties.java#628)). –

+1

[Ta linia] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Properties.java#364) oznacza, że ​​istnieje różnica zachowania, jeśli dwukropek nie uciekł. –

+0

Ponieważ jest to określone w dokumentacji. – EJP

Odpowiedz

2

load metoda klasy Properties wymienić następujące:

Klucz zawiera wszystkie znaki w linii zaczynające się od pierwszego spoza białych znaków spacji i do, ale nie włączając, pierwszego bez żadnego znaku " = ',': ' lub znak spacji białej inny niż terminator linii. Wszystkie te kluczowe znaki zakończenia mogą być zawarte w kluczu poprzez ich usunięcie z poprzedzającym ukośnikiem znakowym;

...

Jako przykład, każdy z następujących trzech linii określa klucz "prawda" i związanego z wartości elementu "Beauty":

Truth = Beauty

Truth:Beauty

Truth :Beauty

Tak więc dwukropek może być użyty do określenia końca klucza w pliku właściwości.

1

Ponieważ składnia pliku właściwości pozwala na użycie dwukropka jako separatora między kluczami i wartościami zamiast znaku równości (można użyć tylko spacji), więc aby zapobiec problemom, jeśli zmienisz separator, który je odrzuca, może być dobrym pomysłem.

Na przykład:

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

można sprawdzić inne opcje w wikipedia entry

Powiązane problemy