2010-01-21 2 views
29

Мы получаем свойства (которые не можем влиять) из базы данных и хотим получить к ним доступ путем сопоставления ключей/значений. Мы столкнулись с проблемой, что один из ключей свойств содержит пустой символ.Может ли ключ в свойстве Java содержать пустой символ?

foo bar = barefoot 

Это - правильно - интерпретировать следующим образом

key: foo 
value: bar = barefoot 

Есть ли способ, чтобы включить пробел в ключе, так что это не интерпретируется как разделитель? Я предполагаю, что это поведение так же, как и предполагалось, но я подумал, что могу попробовать здесь.

+2

Это право есть в документации: http://java.sun.com/javase/6/docs/api/java/util/Properties .html # нагрузки (java.io.Reader) –

ответ

11

Как представляется, разделитель должен быть =, а не пробелом. Следовательно - keyValuePair.split("=") должен делать.

При загрузке этого из файла Java .properties, то вы можете расширить java.util.Properties и переопределить этот метод

public synchronized void load(InputStream inStream) throws IOException 

так, что он анализирует свойства правильно.

+2

Hm, переопределяя методы в 'Свойствах ', кажется, в лучшем случае dubios. Вероятно, в классе свойств есть много жестко сформулированных предположений, поэтому это источник будущих ошибок. Если это не правильный файл свойств, я бы предпочел не использовать «Свойства» для его чтения. – sleske

+0

По крайней мере, нужно попробовать, потому что это сэкономит много времени. Если это не сработает - создайте отдельный анализ свойств курса – Bozho

+0

Как вы устанавливаете 'keyValuePair.split (" = ")'? – Xonatron

12

Может быть, вы можете избежать пробельные: foo\ bar = barefoot

Edit: К сожалению, я не видел, что вы не можете изменить свойства.

+2

Нет, может быть, об этом: http://pastie.org/787892 Производит http://pastie.org/787893 –

+0

Экранирование пробелов не будет работать с большинством редакторов, которые по умолчанию ограничивают пробелы в конце строк - подумайте о мэйнфрейма, для которого требуются конечные пробелы. Правильно - решение Вячеслава. –

4

Я предполагаю, что по свойствам вы имеете в виду файл свойств Java (как написано/читается java.util.Properties).

Тогда, как вы пишете сами,

foo bar = barefoot 

действительно должны быть интерпретированы как

key: foo 
value: bar = barefoot 

Там нет никакого способа установить это с помощью встроенного в Properties класса. Вы должны либо манипулировать своим вводом (бежать пробелом, изменить его на _ и обратно ...), либо написать собственный парсер. Написание собственного анализатора, вероятно, лучше, так как очевидно, что ваш вход не является файлом свойств Java, который начинается с :-).

+3

+1 «на самом деле не файл свойств Java для начала». Люди видят «ключ = значение» и предполагают, что это файл свойств. Они забывают, что в файле свойств существует довольно много правил, и если ваш вход не соответствует ** всем ** из них, то это не файл свойств. Другой пример: свойства Java используют по умолчанию кодировку Latin1 (a.k.a ISO-8859-1) и поддерживают escape-последовательности Unicode. –

+0

Написание собственного анализатора также необходимо позаботиться о блоке комментариев в .properties. –

+0

@OmSao: Верно. Это хорошо иллюстрирует проблему, что важно убедиться, что вы точно понимаете, что файл может или не может содержать. – sleske

114

Вы можете избежать все, что в свойствах файла с Java Unicode:

  • \u003d для =
  • \u0020 пробельным

Например:

foo bar = barefoot 

должно быть:

foo\u0020bar\u0020=\u0020barefoot 

Так будет:

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

Это правильный ответ. Все остальные варианты получат нестандартные решения. ПОЖАЛУЙСТА, используйте этот ответ :) – Yinzara

+1

Да, это сработало! Это правильный ответ. – Artin

+1

Обратите внимание, что это, похоже, не работает в конфигурационных файлах Grails (не .groovy, но .properties, проверено на 2.5.1). – Newerth

0
keyValuePair = keyValuePair.substring(0,indexOf("=")).replaceAll("\\s+") + 
       keyValuePair.substring(indexOf("="));