2010-01-21 12 views
29

Otrzymujemy właściwości (które nie mogą wpływać) z bazy danych i chcemy uzyskać do nich dostęp za pomocą mapowania klucz/wartość. Mamy do czynienia z problemem, że jeden z kluczy właściwości zawiera pusty znak.Czy klucz w właściwości Java może zawierać pusty znak?

foo bar = barefoot 

To jest - słusznie - interpretować następująco

key: foo 
value: bar = barefoot 

Czy istnieje sposób na to puste miejsce w kluczu tak, że nie jest interpretowany jako separator? Myślę, że to zachowanie jest dokładnie takie, jak zamierzano, ale pomyślałem, że mógłbym spróbować tutaj.

+2

To właśnie tam w docs: http://java.sun.com/javase/6/docs/api/java/util/Properties .html # load (java.io.Reader) –

Odpowiedz

11

Jak się wydaje, ogranicznik powinien być =, a nie spacja. Dlatego też - powinien zrobić keyValuePair.split("=").

Jeśli ładujesz ten z pliku java .properties, wówczas można rozszerzyć java.util.Properties i nadpisać tą metodę

public synchronized void load(InputStream inStream) throws IOException 

tak, że analizuje właściwości poprawnie.

+2

Hm, nadpisywanie metod w "Właściwościach" w najlepszym razie wygląda na dubiów. Prawdopodobnie istnieje wiele zafałszowanych założeń w klasie Właściwości, więc jest to źródło przyszłych błędów. Jeśli nie jest to właściwy plik właściwości, wolałbym nie używać właściwości do jego odczytu. – sleske

+0

Przynajmniej warto spróbować, bo zaoszczędziłoby to dużo czasu. Jeśli to nie działa - utwórz osobny pakiet właściwości oczywiście – Bozho

+0

Jak ustawić 'keyValuePair.split (" = ")'? – Xonatron

12

Może uciec spacje: foo\ bar = barefoot

Edit: Ups, nie widzę, że nie można zmieniać właściwości.

+2

No może o tym: http://pastie.org/787892 Produkuje http://pastie.org/787893 –

+0

Uciekające białe spacje nie będą działać z większością edytorów, które domyślnie przycinają spacje na końcu linii - pomyśl o Parametr mainframe, który wymaga spacji końcowych. Prawidłowe jest rozwiązanie Veaceslava. –

4

Zakładam, że według "właściwości", masz na myśli plik właściwości Java (napisany/przeczytany przez java.util.Properties).

Potem, jak sam piszesz,

foo bar = barefoot 

musi rzeczywiście być interpretowane jako

key: foo 
value: bar = barefoot 

Nie ma sposobu, aby skonfigurować to za pomocą wbudowanego w Properties klasie. Musisz albo manipulować danymi wejściowymi (uciec od białych znaków, zmienić je na _ i wrócić ...) albo napisać własny parser. Napisanie własnego parsera jest prawdopodobnie lepsze, ponieważ oczywiście twój wkład nie jest tak naprawdę plikiem właściwości Java na początek :-).

+3

+1 "naprawdę nie jest to plik właściwości Java". Ludzie widzą "klucz = wartość" i zakładają, że jest to plik właściwości. Zapominają, że istnieje całkiem sporo reguł dotyczących pliku właściwości, a jeśli dane wejściowe nie są zgodne z ** wszystkimi **, to nie jest to plik właściwości. Inny przykład: właściwości Java domyślnie używają kodowania Latin1 (a.k.a ISO-8859-1) i obsługują uniknięcia kodu Unicode. –

+0

Pisanie własnego analizatora składni zajmie się także blokiem komentarzy w .properties. –

+0

@OmSao: To prawda. To ładnie ilustruje problem, że ważne jest, aby upewnić się, że dokładnie wiesz, co plik może lub nie może zawierać. – sleske

114

można uciec wszystko, co w pliku właściwości Java Unicode:

  • \u003d dla =
  • \u0020 dla spacją

Na przykład:

foo bar = barefoot 

musi być:

foo\u0020bar\u0020=\u0020barefoot 

Więc będzie:

key: "foo bar " 
value: " barefoot" 
+7

To jest odpowiedź "Popraw". Wszystkie inne opcje zakończą się niestandardowymi rozwiązaniami. PROSZĘ skorzystaj z tej odpowiedzi :) – Yinzara

+1

Yup to działało! To jest właściwa odpowiedź. – Artin

+1

Należy zauważyć, że to nie działa w plikach konfiguracyjnych Grails (nie .groovy, ale .properties; testowane na 2.5.1). – Newerth

0
keyValuePair = keyValuePair.substring(0,indexOf("=")).replaceAll("\\s+") + 
       keyValuePair.substring(indexOf("=")); 
Powiązane problemy