Как получить данные из файла свойств

Обновлено: 21.11.2024

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

В этом руководстве показано, как читать и записывать содержимое файла свойств в Java

Пример чтения файла свойств Java

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

Давайте объявим файл свойств

  • Создайте объект свойств. Свойства – это структура данных для хранения ключей и значений в Java.
  • Создайте объект URL с помощью ClassLoader . метод getSystemResource
  • Создайте InputStream с помощью метода url.openStream
  • Загрузить содержимое свойств в объект свойств Java, используя метод загрузки.
  • Добавить блок try and catch для IOExceptions и FIleNotFoundException
  • Односторонняя печать значения с помощью getProperty с ключом объекта свойств
  • Еще один способ — итерация объекта свойств для цикла.
  • Сначала получите все ключи, используя stringPropertyNames
  • используя цикл for для печати ключа и значений.

Как читать файл свойств построчно в Java

  • создал объект File с абсолютным путем
  • Создать BufferedReader с помощью объекта FileReader
  • получить первую строку файла свойств, используя readLine из BufferedReader
  • Выполнять цикл с использованием цикла while, пока не будет достигнут конец строки.
  • Печать каждой строки

Как записать ключ и значения в файл свойств в Java

  • Сначала создайте объект File
  • Создайте объект записи с помощью FileWriter
  • Создать объект свойств и добавить новые свойства или обновить существующие свойства, если файл свойств существует.
  • Метод setProperties обновляет или добавляет ключ и значение
  • метод store объекта свойств записывает в файл свойств. Вы должны добавить комментарий, который добавляется к файлу свойств в качестве комментария

Вот полный пример чтения и записи файла свойств

Вывод файла

Заключение

Вы научились читать файл свойств с ключами и значениями, а также построчно, а также записывать ключ и значения в файл свойств

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

Простая структура проекта Maven для тестирования.

1. Запись в файл свойств

Установите ключ и значение свойства и сохраните их где-нибудь.

Путь/к/config.properties создан.

2. Загрузить файл свойств

Загрузить файл свойств из файловой системы и получить значение свойства.

3. Загрузите файл свойств из пути к классам

Загрузить файл свойств config.properties из пути к классам проекта и получить значение свойства.

4. Печатает все из файла свойств

Загрузите файл свойств config.properties из пути к классам проекта и распечатайте ключи и значения.

Загрузить исходный код

Ссылки

мкён

Комментарии

Я всегда получаю сообщение "Извините, не удалось найти " + имя файла в сценарии 4

Примечание. У меня есть файл свойств, который отлично работает со сценарием №. 2

Пожалуйста, помогите?

Для App4 он загружается из src/main/resources/config.properties

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

Я не могу найти файл config.properties. Кто-нибудь может мне помочь?

Ооо, чувак, которого ты можешь создать сам, это несложно

Статья обновлена, для App1 и App2 вам необходимо указать собственное местоположение, по умолчанию оно будет сохранено в корневую папку проекта.

Для App3 он загружается из src/main/resources/config.properties

Вам необходимо добавить в проект вручную. .

вы можете либо указать точный каталог, либо перейти на один уровень выше, например, src/main/resources/config.properties

Можно ли использовать переменные в файле свойств? что-то вроде этого:

Статья обновлена, App3 — это название класса.

App3 — это ошибка. Это должно быть приложение.
Это означает название класса, вот и все.

Я вижу, как читать из пути к классам, но как насчет записи в него?

См. примеры App1 и App2.

Разве вам не нужно закрывать поток? например наконец?

Можете поделиться названием темы ide, пожалуйста

Как читать и записывать файл .cfg в Java?

Я включил это как банку в свое основное приложение. Ошибок не получаю, но не вижу.файл свойств создается на сервере свободы, и впоследствии свойства не загружаются в другие файлы Java.

Спасибо, я нашел это очень полезным

Здравствуйте, я новичок в java, можете ли вы сказать мне, в чем разница между пунктом 2 (загрузить файл свойств из файловой системы) и пунктом 3 (загрузить файл свойств config.properties из пути к классам проекта), и может ли вы предлагаете мне, когда я должен использовать пункт 2 или пункт 3? Большое спасибо.

Я хочу прочитать из config.properties и сохранить его в новом окружении.properties. кто поможет

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

Да, см. пример App1.

@Mkyong, ты живая легенда.

как добавить теги html и повлиять на интерфейс через файл пакета ресурсов, например: мне нужно показать более жирный текст на интерфейсе, я пробовал ЖИРНЫМ, но это не работает.

Мой файл не принимается для чтения. Пожалуйста, дайте мне какое-нибудь предложение

static public void main(String args[]) выдает IOException

Properties prop = new Properties();

InputStream input = new FileInputStream("F:\workspace\Practice\config.properties");

Set set = prop.keySet();

for (Object r : set) System.out.println(r + ” value is: ” + prop.getProperty((String) r));

простой способ распечатать пару "ключ-значение"

Я следовал руководству, используя этот код:
1. Запись в файл свойств
тестировал код на коте, но не создал файл, почему? как узнать почему?
2) по какому пути был создан файл?
мой кот установлен на /opt/tomcat

Я не тестировал сам ecode на сервере Glassfish и работал, создал файл по адресу:
/opt/glassfish4/glassfish/domains/swManzana/config/

У меня есть следующий код, пытающийся прочитать файл свойств:

Я получаю исключение в последней строке. В частности:

17 ответов 17

Исходя из вашего исключения, InputStream имеет значение null, это означает, что загрузчик классов не находит ваш файл свойств. Я предполагаю, что myProp.properties находится в корне вашего проекта, если это так, вам нужна предшествующая косая черта:

моя иерархия файлов: src -> myPackage -> myClass.java , myProp.properties. Я сделал то, что вы мне посоветовали, но все равно выдает то же исключение

getResourceAsStream ищет файл в пути к классам. Если ваш файл свойств находится в каталоге пакета myPackage, используйте /myPackage/myProp.properties в качестве пути.

@Mark Elliot, что, если у меня есть пакет conf для хранения всех моих файлов конфигурации, а моя файловая иерархия такова: myproject ->src, conf, test, как мне загрузить свойства, добавив предшествующую косую черту?

Не забудьте закрыть Reader в prop.load(reader) , согласно документации: указанный поток остается открытым после возврата этого метода

В этой ссылке много методов. Почему вы выбрали вариант с загрузчиком классов? Есть ли у этого метода преимущества или недостатки?

Вы можете использовать класс ResourceBundle для чтения файла свойств.

conf/filename.properties основан на корневом каталоге проекта

Я использую Jenkins, поэтому приятно иметь решение, которое не зависит от кучи махинаций с ClassPathLoader. Спасибо!

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

в статическом контексте.

Лучше всего получить контекст приложения, например -

тогда вы можете загрузить файл ресурсов из пути к классам -

Это будет работать как для статического, так и для нестатического контекста, и самое приятное то, что этот файл свойств может находиться в любом пакете/папке, включенном в путь к классам приложения.

Ваш файл должен быть доступен как com/example/foo/myProps.properties в пути к классам. Затем загрузите его как:

если ваши config.properties находятся не в каталоге src/main/resource, а в корневом каталоге проекта, вам нужно сделать что-то вроде ниже:-

Убедитесь, что имя файла указано правильно и что файл действительно находится в пути к классу. getResourceAsStream() вернет значение null, если это не так, из-за чего последняя строка выдает исключение.

Если myProp.properties находится в корневом каталоге вашего проекта, используйте вместо него /myProp.properties.

моя иерархия файлов: src -> myPackage -> myClass.java , myProp.properties. Я сделал то, что вы мне посоветовали, но все равно выдает то же исключение

Я получал исключение в первую очередь без ведущей косой черты. Он по-прежнему не работает.

Вы можете использовать java.io.InputStream для чтения файла, как показано ниже:

С учетом контекста следует использовать loader.getResourceAsStream("myPackage/myProp.properties").

Значок "/" не работает с методом ClassLoader.getResourceAsStream(String).

В качестве альтернативы вы можете использовать метод Class.getResourceAsStream(String), который использует символ "/", чтобы определить, является ли путь абсолютным или относительным относительно местоположения класса.

Примеры:

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

Если ваш путь к файлу свойств и ваш путь к классу Java совпадают, вы должны это сделать.

Например:

Во многих ответах здесь описываются опасные методы, когда они создают экземпляр входного потока файла, но не получают ссылку на входной поток, чтобы позже закрыть поток. Это приводит к оборванным входным потокам и утечкам памяти. Правильный способ загрузки свойств должен быть примерно таким:

Обратите внимание на создание экземпляра входного потока файла в блоке try-with-resources. Поскольку FileInputStream может быть закрыт автоматически, он будет автоматически закрыт после выхода из блока try-with-resources. Если вы хотите использовать простой блок try, вы должны явно закрыть его с помощью fis.close(); в блоке finally.

Ни один из текущих ответов не показывает закрытие InputStream (это приведет к утечке файлового дескриптора) и/или не имеет дело с .getResourceAsStream(), возвращающим значение null, когда ресурс не найден (это приведет к исключению NullPointerException с сбивающее с толку сообщение «параметр inStream имеет значение null» ). Вам нужно что-то вроде следующего:

Для чтения файла свойств в исходном порядке:

Хорошей практикой, которой не было в предыдущем решении, является передача свойств, особенно файлов свойств, созданных во время компиляции с помощью подключаемых модулей сборки, возможно, заключается в использовании PropertySourcesPlaceholderConfigurer

В этом руководстве по Java вы научитесь читать файл свойств с помощью метода Properties.load(). Также мы будем использовать метод Properties.setProperty() для записи нового свойства в файл .properties.

1. Настройка

Ниже приведен файл свойств, который мы будем использовать в нашем примере.

2. Чтение файла свойств

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

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

Пример 1. Чтение файла .properties в Java

В данном примере мы считываем свойства из файла app.properties, который находится в пути к классам. Класс PropertiesCache действует как кеш для загруженных свойств.

Файл загружает свойства лениво, но только один раз.

В приведенном выше коде мы использовали технику Билла Пью для создания одноэлементного экземпляра.

Давайте протестируем приведенный выше код.

3. Запись в файл свойств

Лично я не вижу веских причин для изменения файла свойств из кода приложения. Только время, это может иметь смысл, если вы готовите данные для экспорта стороннему поставщику/или приложению, которому нужны данные только в этом формате.

Пример 2: Java-программа для записи новой пары "ключ-значение" в файл свойств

Итак, если вы столкнулись с похожей ситуацией, создайте еще два метода в PropertiesCache.java следующим образом:

  • Используйте метод setProperty(k, v) для записи нового свойства в файл свойств.
  • Используйте метод flush(), чтобы записать обновленные свойства обратно в файл application.properties.

И обновленный файл свойств:

Это все, что касается этого простого и легкого руководства, посвященного чтению и записи файлов свойств с помощью java.

Свойства приложения могут различаться в разных средах, например, как хосты в вашей среде контроля качества могут отличаться от ваших локальных и рабочих сред. Используя Spring Boot, различные среды можно настраивать и обновлять отдельно, не затрагивая другие среды с помощью файлов свойств.

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

Файлы свойств Spring Boot

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

Файл свойств по умолчанию, создаваемый Spring Boot, называется application.properties и находится в каталоге проекта src/main/resources/. При инициализации проекта файл свойств по умолчанию пуст.

Вот пример файла application.properties, содержащего два примера свойств:

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

Файлы свойств YAML

Кроме того, вместо стандартного синтаксиса .properties Spring Boot также поддерживает файлы свойств в формате YAML. Таким образом, вместо файла application.properties по умолчанию вы можете создать новый файл свойств application.yml, если предпочитаете свои свойства в формате YAML:

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

Spring Boot позволяет объявлять несколько файлов свойств с помощью аннотации @PropertySource, определенной через класс конфигурации.

Доступ к значениям в файлах свойств в Spring Boot

Теперь мы переходим к основной теме — как получить доступ к значениям в вышеупомянутых файлах свойств.

Использование аннотации @Value

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

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

Если мы напечатаем приведенную выше переменную без каких-либо дополнительных манипуляций, вывод должен быть значением указанного свойства, объявленного в аннотации @Value. В этом случае он должен вывести строку user :

Если свойство, объявленное в аннотации, не существует ни в одном файле свойств, будет соблюдаться инициализация типа данных по умолчанию. В этом случае для переменной username будет установлено значение null .

Обновление значения переменной, помеченной аннотацией @Value, также изменяет фактическое значение свойства, введенного в переменную во время выполнения:

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

Вот ссылка на наше подробное руководство по аннотации @Value, если вы хотите узнать о ней больше.

Использование объекта среды

Еще один метод доступа к значениям, определенным в Spring Boot, – автоматическое связывание объекта Environment и вызов метода getProperty() для доступа к значению файла свойств.

Метод getProperty() принимает один обязательный параметр, представляющий собой строку, содержащую имя свойства, и возвращает значение этого свойства, если оно существует. Если свойство не существует, метод вернет нулевое значение.

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

Для этого примера давайте получим доступ к свойству logging.level.root и сохраним его в строковом значении:

Если вызвать и распечатать метод getRootLogLevel(), он распечатает значение свойства, если оно существует. С приведенным выше примером файла свойств этот метод должен выводить INFO .

Использование аннотации @ConfigurationProperties

Аннотация @ConfigurationProperties — это более широкий подход, чем аннотация @Value и объект Environment.

Этот метод используется для доступа к связанным группам свойств путем сохранения конфигурации в POJO (обычный старый объект Java) и использования POJO для дальнейшего доступа, в отличие от предыдущих решений, в которых доступ к свойствам осуществляется по отдельности.

Аннотация @ConfigurationProperties сопоставляет значения с учетом префикса группы свойств.

Для этого решения давайте создадим новый файл application.properties:

Все 3 свойства, настроенные в файле, имеют одинаковый префикс spring.demo .

Теперь давайте создадим класс конфигурации для сопоставления значений этих свойств с помощью аннотации @ConfigurationProperties.

Обратите внимание, что помимо аннотации класса с помощью @ConfigurationProperties , вам также необходимо аннотировать его с помощью @Configuration, чтобы сообщить системе, что класс является классом конфигурации.

Кроме того, имена переменных в классе должны совпадать с именами в файле свойств с заданным префиксом. Давайте создадим класс DemoProperties:

Теперь, когда конфигурация объявлена, экземпляр DemoProperties можно использовать в любом месте на уровне службы для доступа к значениям свойств, просто автоматически подключая класс:

Вызов метода printDemoProperties() приведет к выводу:

Заключение

В этой статье были рассмотрены три различных способа доступа к определениям значений в Spring Boot. Все это довольно легко понять и применить в своих проектах!

Аннотация @Value является наиболее часто используемым решением для доступа к значениям свойств в Spring Boot. Объект Environment используется не так часто, но все же является жизнеспособным способом доступа к значению свойства.

Аннотация @ConfigurationProperties является более полной и должна использоваться только для больших групп свойств с одинаковым префиксом и одинаковым контекстом, поскольку вам потребуется приспособить это решение, создав POJO для хранения группы значений свойств. .

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