Принятый формат для конфигурационных файлов в java

Обновлено: 07.07.2024

У меня есть конфигурационный файл с именем config.txt, похожий на этот.

Я хочу изменить некоторое значение конфигурационного файла в Java, скажем, порт на 10045. Как я могу легко достичь?

В моей пробной версии мне нужно написать много кода, чтобы прочитать каждую строку, Найти PORT, удалить исходный 10022, а затем переписать 10045. мой код фиктивный и трудно читаемый. Есть ли какой-нибудь удобный способ в java?

Я сделал приложение java, которое манипулирует несколькими матрицами, полученными в качестве входных данных, а затем выводит некоторый текст. В настоящее время матрицы жестко закодированы в моем приложении (для тестирования), но перекомпиляция довольно глупа для новой матрицы. Поэтому я ищу формат.

Можно ли инициализировать системные свойства Java с помощью какого-то конфигурационного файла? (т. е.: можете ли вы установить java.library.path, используя файл внутри вашего jar) EDIT: уточнение: я спрашиваю конкретно об инициализации системных свойств до значения в файле, а не о том, чтобы.

Если вам нужно что-то короткое, вы можете использовать это.

К сожалению, он не сохраняет порядок, поля или какие-либо комментарии.

Если вы хотите сохранить порядок, чтение строки за раз не так уж плохо.

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

Мое предложение состояло бы в том, чтобы прочитать весь конфигурационный файл в память (возможно, в список объектов пары (attribute:value)), выполнить любую обработку, которую вам нужно сделать (и, следовательно, внести какие-либо изменения), а затем перезаписать исходный файл со всеми внесенными вами изменениями.

Используйте класс Свойств для загрузки/сохранения конфигурации. Затем просто установите значение и сохраните его снова.

Это легко и просто.

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

Кто-нибудь, пожалуйста, дайте нам знать, что делать, когда у нас есть какой-то конфигурационный файл, который в основном xml. Я хочу, например, указать путь для сохранения изображения(для моей программы java) в папке из какого-то конфигурационного файла (в моем случае xml).В этом случае, где.

Существует ли какая-либо программа java или api для изменения содержимого конфигурационного файла haproxy? например, для динамического добавления / удаления нескольких конфигураций.

Рассмотрите возможность использования java.util.Properties , а также методов load() и store(). Но помните, что это не сохранит комментарии и дополнительные разрывы строк в файле. Также необходимо избежать некоторых символов.

Похожие вопросы:

Я использую java KeyStore для хранения защищенной информации пользователя и блокировки (шифрования) хранилища ключей паролем и извлечения информации паролем, когда это необходимо, что работает.

Я сделал приложение java, которое манипулирует несколькими матрицами, полученными в качестве входных данных, а затем выводит некоторый текст. В настоящее время матрицы жестко закодированы в моем.

Можно ли инициализировать системные свойства Java с помощью какого-то конфигурационного файла? (т. е.: можете ли вы установить java.library.path, используя файл внутри вашего jar) EDIT: уточнение: я.

Кто-нибудь, пожалуйста, дайте нам знать, что делать, когда у нас есть какой-то конфигурационный файл, который в основном xml. Я хочу, например, указать путь для сохранения изображения(для моей.

Существует ли какая-либо программа java или api для изменения содержимого конфигурационного файла haproxy? например, для динамического добавления / удаления нескольких конфигураций.

Я нахожусь в проекте, в котором мне нужно изменить html файла textview с java. В java у меня есть значение в String следующим образом String a =HAI; Я должен установить этот HAI на html textfield .

Я хочу изменить значение параметра, переданное определенному методу класса java. Вот файл java: package config; public class ABC extends LineAvailabilityNew < public void doMessageDataOverrides().

Могу ли я изменить расположение глобального конфигурационного файла Git (

Я создаю приложение Java с намерением упаковать его в исполняемый файл Windows в будущем. Можно увидеть структуру моего проекта NetBeans здесь. В настоящее время я читаю config.properties с помощью getResourceAsStream (). Я не знал, что в этот файл нельзя записать подобным образом. Может ли кто-нибудь посоветовать способ достижения этой цели или требуется другой подход к моей проблеме? Спасибо.

2 ответа

Я думаю, вы можете использовать java.util.properties для решения своей проблемы; чтобы записать в свои свойства, сначала создайте новый объект Properties , load их через ваш InputStream , используйте такие методы, как setProperty , чтобы добавить в вашу конфигурацию, и, наконец, используйте store , чтобы написать им.

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

API настроек Java - это попытка обойти эту проблему, предоставляя платформенно-нейтральный API для настроек. В Linux данные фактически хранятся в XML-файле в подкаталоге $HOME/.java , но, конечно, программисту это не должно волновать. Использование этого API удобно, но не позволяет хранить сложные данные и не позволяет программисту легко предоставить приложению способ чтения конфигурации из некоторого определенного места.

Вместо использования API настроек вы можете явно читать / писать файлы. Для простой конфигурации «имя = значение» вы можете использовать объект Properties , у которого есть методы для обработки файлов. Этот метод допускает конкретное расположение файла, но, конечно же, управление расположением файла требует некоторой адаптации для различных платформ, которые вы можете поддерживать.

Если ваша конфигурация сложнее, чем 'name = value', вы можете читать / записывать ее в любом формате по вашему выбору - JSON, YAML, XML и т. Д. Все эти форматы файлов хорошо поддерживаются Java. Использование текстового формата позволяет пользователям редактировать конфигурацию с помощью других инструментов, если они того пожелают.

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

Если вы когда-либо намереваетесь запускать приложение в контейнере (Docker и т. Д.), Тогда применяются совершенно другие соображения. Вам нужно будет использовать метод экстернализации конфигурации, совместимый с контейнерной платформой - простое чтение и запись файлов часто неуместны в такой среде.

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

В наше время почти в каждом проекте используются различные статические файлы и данные, необходимые классам для безопасного и быстрого доступа. Примером таких конфигурационных файлов являются так называемые Файлы свойств, более известные как *.properties.

Каждый параметр сохраняется парой двух переменных строчной типа, одна сохраняет имя параметра (так называемый ключ), а другой сохраняет значение. Каждая строка файла .properties, как правило, хранит значения одного параметра. Несколько форматов являются допустимыми для .properties, в том числе ключ = значение, ключ: значение и сам ключ.

Например работы с .properties в Java

Для начала подготовим среду для работы и создадим проект (Рисунок 1):

1

Теперь посмотрим на структуру созданного проекта (Рисунок 2):

2

Как видим, в папке Resources уже есть файл под названием config.properties. Вам нужно будет его создать вручную и наполнить данными, а именно (Рисунки 3-4):

3

4

Далее прописываем необходимые ключи и значения, как на рисунке 5:

5

Пример обращения к файлу properties

Ниже представлена программа, демонстрирующая обращение к нашему конфигурационному файлу:

[an error occurred while processing this directive]

Конфигурация JAVA приложения с помощью XML

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive] (none)
[an error occurred while processing this directive] ([an error occurred while processing this directive] Андрей Романенко [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

  • Введение
  • Скачаем все необходимые библиотеки
  • Создадим проект в Eclipse
  • Создадим тестовый файл с конфигурацией и заготовку класса
  • Наш первый класс
  • Дополнительные возможности работы с параметрами конфигурации
  • Последние штрихи

Введение

Очень часто Java разработчику необходимо вынести настройку программы за пределы исходного текста, чтобы конфигурирование можно было проводит без перекомпиляции всей системы. К подобным настройкам можно отнести сетевые порты, адреса серверов, пути на жестком диске и даже внешний вид приложения. Если разработчик использует какой-либо framework, то , возможно, данные задачи уже решены. Но такое решение будет иметь небольшой недостаток: пользователь, проводящий настройку, должен разбираться в framework, что не всегда возможно.

Исходя из этого многие разработчики придумывают свою систему: текстовые файлы, xml файлы, механизм properties, предоставляемый самой платформой java, и тп.

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

Примером подобного xml файла с настройками может служить фрагмент:

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

При этом реализация используют только бесплатные open-source библиотеки.

Для исполнения примеров Вам понадобится JDK 1.5 (хотя примеры сработают и в среде 1.4).

где Вы можете скачать и исходные текста, и уже скопилированную библиотеку в виде JAR.

ConfigLoader поддерживает загрузку конфигураций из файлов и текстовых переменных. Загрузка из текстовых переменных удобна при получении настроек с сервера, по сети.

Сами примеры были написаны в IDE Eclispe, но аналогичные действия можно произвести в любой другой среде разработке, или при работе с командной строки.

Скачаем все необходимые библиотеки

Дополнительно нам понадобится библиотека, реализующая SAX – simple api for XML. В мире java представлено множество подобных разработок, но для определенности воспользуемся xerces – решением от сообщества apache.

Актуальную версию можно скачать здесь:

понадобится файл - Xerces-J-bin.*.zip

Создадим проект в Eclipse

В IDE Eclipse выбираем пункт создания нового проекта, имя задайте на ваш вкус, и укажите JDK версию 1.5

Остальные настройки проекта на ваше усмотрение.

В самом проекте создайте папку lib и скопируйте в нее 3и файла:

  • скачанный configloader.jar
  • xercesImpl.jar (из скачанного zip архива)
  • xml-apis.jar (так же из архива)

И добавьте их в build path, путем правого клика – Build Path – Add to Build Path

Создадим тестовый файл с конфигурацией и заготовку класса

В Eclipse создадим папку xml (в корне нашего проекта) и в нее запишем файл example1.xml , в который скопируем ранее представленный xml.

Теперь создадим пакет (File – New – Package) и зададим имя “ configarticle ”. В этом пакете мы и будем держать наши тестовые классы.

Наш первый класс

Для определенности мы хотим, чтобы наш первый класс читал секцию mail из файла конфигурации: smtp, login и password; и выдавал эти данные на консоль.

Создадим новый класс “ Example1 ” в пакете “ configartice ”.

Для начала нам необходимо импортировать нужные классы, точнее класс:

В самом теле класса создадим метод main

наши дальнейшие строки кода мы будем добавлять в тело этого метода.

Первая наша строка – создание объекта, который и позволит нам удобно работать с конфигурациями.

Этот момент опишем чуть подробнее. Как уже говорилось ранее для работы с xml нам нужен так называемый sax parser. Т.е. java класс поддерживающий определенные интерфейсы.

Библиотека ConfigLoader по умолчанию работает с Xerces parser, а раз мы его уже скачали и добавили в CLASSPATH, то конструктора без параметров нам достаточно.

В случае если вы выбрали другой parser, то вам надо сделать несколько дополнительных шагов.

Если вы сконфигурировали default xml parser для вашей JRE (через файл jaxp.properties), то создать ConfigLoader можно так:

(параметр – пустая строка)

Если вы не уверенны, что у клиента на его JRE подобная настройка будет, то вам надо выяснить имя класса parser'a для sax1 (из документации).

Для Xerces это будет: org.apache.xerces.parsers.SAXParser

Для Piccolo (другой популярный parser): com.bluecast.xml.Piccolo

И создание ConfigLoader будет таким:

Следующим шагом будет загрузка самой конфигурации, сделать это тоже весьма просто:

метод может вызвать RuntimeException – если файл не найден, либо содержит не правильный xml. Поэтому в реальной программе правильно будет поместить операцию загрузки в try-catch блок и в случае RuntimeException сообщать пользователю об ошибке.

Теперь самое интересное, нам надо прочитать значения трех тегов smtp, login и password, которые вложены в тэги mail и config.

Код при этом прост:

Не трудно заметить, как нам обратиться нужному тегу: надо просто задать цепочку имен тегов, начиная от корневого и так до него нужного нам.

Т.е. если мы хотим получить количество потоков(threads) из секции производительность(performance), то нам надо задать имя: “ config.performance.threads

Полный текст нашего примера будет таким:

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

Разработчик может использовать простой и надежный подход во всех проектах, а пользователь (даже не высококвалифицированный) будет иметь возможность ясно настраивать приложение.

Дополнительные возможности работы с параметрами конфигурации

Ранее был приведен пример загрузки настроек без повторяющихся тегов, т.е. цепочка “имя_тега.имя_тега. имя_тега” однозначно идентифицировала нужное нам значение.

Но параметры могут иметь и подобную структуру:

Т.е. цепочка config.listen.ip уже соответствует не одному, а нескольким (трем в данном случае) значениям.

Попробуем решить эту задачу.

Приведенный xml скопируем в новый файл: xml/example2.xml

И создадим новый класс Example2 , с содержимым:

Для начала попробуем добавить след. строку после комментария и посмотрим, что она вернет:

Результат будет: Value1 = 192.168.5.2

Что было предсказуемо: путь " config.listen.ip " означает кратчайшее расстояние по тегам, т.е. в случае если у тега A есть несколько вложенных тегов B, то путь “A.B” будет означать первый дочерний тег B.

Для получения значения второго вложенного тега можно применить такой путь: “A.B”,”1”

Или для нашего файла example2 :

что нам вернет: Value2 = 192.168.5.3

Таким образом мы видим, что можем получить значение любого тега из группы, зная его номер (считая с 0).

Примерами путей могут быть:

Последние штрихи

Напоследок опробуем несколько дополнительных операций.

Теги могут иметь параметры, как например некоторые теги ip из нашего примера. Получить эти значения можно так:

Подобным образом можно получить список имен всех параметров:

Допустим мы заранее не знаем количество вложенных тегов ip. Для того, чтобы выяснит их кол-во мы можем применить метод:

Читайте также: