#java #properties
#java #свойства
Вопрос:
Мне нужно, чтобы мое Java-приложение считывало свойства конфигурации из файла и использовало их во всех классах. Я думаю об отдельном классе, который возвращал бы карту property_key:property_value
для каждого из свойств в файле. Затем я бы прочитал значения из этой карты в других классах. Может быть, есть другие, более часто используемые параметры?
Мой файл свойств прост и содержит около 15 записей.
Ответ №1:
Просто используйте java.util.Properties
для его загрузки. Он Map
уже реализован. Вы можете загружать и получать доступ к свойствам статически. Вот пример, предполагающий, что у вас есть config.properties
файл в com.example
пакете:
public final class Config {
private static final Properties properties = new Properties();
static {
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
properties.load(loader.getResourceAsStream("com/example/config.properties"));
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}
public static String getSetting(String key) {
return properties.getProperty(key);
}
// ...
}
Который можно использовать как
String foo = Config.getSetting("foo");
// ...
При необходимости вы можете абстрагировать эту реализацию с помощью интерфейса и получить экземпляр с помощью абстрактной фабрики.
Комментарии:
1. Я попробовал ваше решение, но оно на самом деле не работает. Я всегда получаю ошибку ExceptionInInitializerError. Самый простой случай, который я пытаюсь протестировать, — это вызов System.out.println(ConfigReader.GetSetting(«property.name «)); из основного метода другого класса. Чего мне не хватает?
2. В чем основная причина этой ошибки? При получении исключений вы всегда должны искать в трассировке стека самую нижнюю часть «вызвано» или «основная причина» для реальной причины проблемы. В любом случае, я предполагаю, что на самом
config.properties
деле он не находится в корне пути к классу (как в данном примере) или что вы забыли исправить / заменить путь к примеру фактическим путем (на случай, если он имеет другое имя файла или находится в пакете).3. Основная причина вызвана: java.lang. Исключение NullPointerException. Файл свойств находится внутри пакета, на одном уровне с конфигуратором и основным классом. Я также попробовал абсолютный путь к файлу свойств, который тоже не работает.
4. Затем вы должны использовать
getResourceAsStream("com/example/config.properties")
. Я обновил ответ, чтобы включить пример. Кстати, я не уверен, что вы имеете в виду под «абсолютным путем», но, пожалуйста, никогда не думайте об использовании путей файловой системы локального диска, какC:pathtoconfig.properties
для этого. Всегда берите их из пути к классу.5. Спасибо, это работает, и теперь я понимаю процесс. Каким будет решение, если мне нужно, чтобы файл свойств находился где-то в файловой системе вне пакета или вне пути к классу?