Как получить данные из файла свойств
Обновлено: 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 для хранения группы значений свойств. .
Читайте также: