Свойства Java: файлы .properties vs xml?

Я новичок, когда дело доходит до свойств, и я читал, что XML является предпочтительным способом их хранения. Однако я заметил, что запись обычного файла .properties в стиле

foo=bar
fu=baz

также работает. Это означало бы гораздо меньше ввода (и, возможно, более легкое чтение и более эффективную работу). Итак, каковы преимущества использования XML-файла?


person pg-robban    schedule 04.09.2009    source источник


Ответы (7)


В XML вы можете хранить более сложные (например, иерархические) данные, чем в файле свойств. Так что это зависит от вашего варианта использования. Если вы просто хотите сохранить небольшое количество прямых свойств, файл свойств легче обрабатывать (хотя класс свойств Java также может считывать свойства на основе XML).

В любом случае имеет смысл сделать ваш интерфейс конфигурации как можно более общим, чтобы у вас не было проблем с переключением на другое представление (например, с помощью Конфигурация Apache Commons ), если вам нужно.

person Daff    schedule 04.09.2009
comment
К вашему сведению: класс java.util.Properties поддерживает XML: java.sun.com/javase/6/docs/api/java/util/ java.sun.com/javase/6/docs/api/ Java/утилита/ - person Asaph; 04.09.2009
comment
Изменить: приведенные выше URL-адреса искажены, закрывающая скобка должна быть частью ссылок. - person Asaph; 04.09.2009
comment
пожалуйста, проверьте / добавьте ответ Майка Сиклера, прежде чем сделать вывод. Вы, конечно, не хотите упустить его точку зрения. - person Jeril Kuruvila; 16.11.2016

Самым большим преимуществом использования XML-файла является то, что XML объявляет свою кодировку, а .properties — нет.

Если вы переводите эти файлы свойств на N языков, вполне возможно, что эти файлы могут вернуться в N разных кодировках. И если вы не будете осторожны, вы или кто-то другой можете необратимо испортить кодировку символов.

person Mike Sickler    schedule 04.09.2009
comment
Это просто неправильно. Файлы свойств Java определены как кодировка ISO8859_1, любая другая кодировка не соответствует спецификации. См. java.sun.com/javase/6/docs. /api/java/util/Properties.html для получения дополнительной информации. - person Mnementh; 04.09.2009
comment
Чувак, он не «объявляет» свою кодировку в файле. - person Mike Sickler; 04.09.2009
comment
Вы упускаете мою мысль. Текстовый редактор или другой инструмент будет подчиняться объявленной кодировке XML-файла, но, поскольку файл свойств не имеет такого объявления, пользователь должен решить, в какой кодировке его сохранить. Это рецепт проблем, если вы выполняете перевод. . - person Mike Sickler; 04.09.2009
comment
Файлы свойств Java имеют кодировку ISO-8859-1. Ложь. Это требуется/предполагается только при использовании старых методов load(InputStream)/store(OutputStream, String). Просто используя load(Reader)/store(Writer, String) (и открывая файл в правильной кодировке), вы можете использовать UTF- 8 или что-то еще. - person leonbloy; 03.03.2015
comment
Согласитесь с этим, это портит файл ... вы можете взять файл свойств на французском языке, открыть его в Windows IntellijIdea и тот же файл открыть в IntellijIdea в Linux. ты получишь коррупцию - person Ashish Ratan; 15.06.2016
comment
Это единственный ответ, который действительно ответил на поставленный вопрос! Почему это не был принятый ответ? - person Simon G.; 25.10.2016

Если у вас много повторяющихся данных, их может быть проще обрабатывать.

<connections>
  <connection>this</connection>
  <connection>that</connection>
  <connection>the other</connection>
</connections>

чем обрабатывать

connection1=this
connection2=that
connection3=the other

особенно если вы планируете хранить много данных или они должны храниться в определенной иерархии

Однако, если вы просто храните несколько скалярных значений, я бы каждый раз использовал простой подход к свойствам.

person Ben Hammond    schedule 04.09.2009
comment
Да, я планировал использовать его для разных значений. Никакие данные не используются совместно с другими файлами. - person pg-robban; 04.09.2009

Если у вас есть как иерархические данные, так и повторяющиеся пространства имен, используйте XML.

1) Чтобы эмулировать только иерархическую структуру в файле свойств, просто используйте запись через точку:

a.b=The Joker
a.b.c=Batgirl
a.b=Batman
a.b=Superman
a.b.c=Supergirl

Таким образом, сложное (иерархическое) представление данных *не является причиной для использования xml.

2) Для простого повторения данных мы можем использовать стороннюю библиотеку, такую ​​​​как ini4j, для явной привязки в java идентификатора счетчика к неявному квантификатору в самом файле свойств.

a.b=The Joker
a.b=Batgirl
a.b=Batman

переводится как (на заднем плане)

a.b1=The Joker
a.b2=Batgirl
a.b3=Batman

Однако нумерация свойств с одинаковыми именами по-прежнему не поддерживает определенные отношения родитель-потомок. т.е. как мы представляем, является ли Бэтгёрл Джокером или Бэтменом?

Таким образом, xml требуется, когда необходимы обе функции. Теперь мы можем решить, нужна ли нам первая запись xml или вторая.

[a]
   [b]Joker[/b]
   [b]
       [c]Batgirl[/c]
   [/b]
[a]

--or--

[a]
   [b]Batman[/b]
   [b]
       [c]Batgirl[/c]
   [/b]
[/a]

Дополнительные сведения см. в .... http://ilupper.blogspot.com/2010/05/xml-vs-properties.html

person ilupper    schedule 12.05.2010
comment
Привет, Kjetil, дело в том, что может представлять запись свойств и что может представлять запись xml. По сути, из-за того, что в записи свойства отсутствует близкая семантика, ее структура менее трехмерна, как выразилось большинство моих коллег. Следовательно, если кто-то попытается эмулировать иерархическую структуру со свойствами над XML, им потребуется контрольный бит. В противном случае возникает двусмысленность. - person ilupper; 10.10.2014

XML удобен для сложных структур данных и/или отношений. Это делает достойную работу для того, чтобы иметь «общий язык» между системами.

Однако xml обходится дорого. Его тяжело потреблять. Вы должны загрузить анализатор, убедиться, что файл имеет правильный формат, найти информацию и т. д.

В то время как файлы свойств довольно легкие и легко читаемые. Работает для простых пар ключ/значение.

person IaCoder    schedule 04.09.2009

Это зависит от данных, которые вы кодируете. С помощью XML вы можете определить более сложное представление данных конфигурации в вашем приложении. Возьмем в качестве примера что-то вроде структуры struts. В рамках у вас есть несколько классов действий, которые могут содержать от 1 до n прямых ветвей. С файлом конфигурации XML вы можете определить его следующим образом:

<action class="MyActionClass">
  <forward name="prev" targetAction="..."/>
  <forward name="next" targetAction="..."/>
  <forward name="help" targetAction="..."/>
</action>

Такую ассоциацию трудно выполнить, используя только пару ключ-значение в файле свойств. Скорее всего, вам нужно будет придумать символ-разделитель, а затем включить все действия вперед для одного свойства, разделенные этим символом-разделителем. Это довольно много работы для хакерского решения.

Тем не менее, как вы указали, синтаксис XML может стать бременем, если вы просто хотите заявить что-то очень простое, например, установить для функции свойство blah значение true.

person dhable    schedule 04.09.2009

Недостатки XML:

  1. Трудно читать - теги делают его более загруженным, чем он есть на самом деле.
  2. Иерархии и теги затрудняют редактирование и повышают вероятность человеческих ошибок.
  3. Невозможно «добавить» к XML-файлу свойств, чтобы ввести новое свойство или предоставить переопределяющее значение для существующего свойства, чтобы последнее из них имело преимущество. Возможность добавления свойства может быть очень мощной — мы можем реализовать вокруг этого логику управления свойствами, чтобы определенные свойства были «горячими», и нам не нужно было перезапускать экземпляр при их изменении.

Файл свойств Java решает вышеуказанные проблемы. Согласованные соглашения об именах и точечная запись могут помочь в решении проблемы иерархии.

person codeforester    schedule 05.10.2017