Как использовать файл свойств конфигурации во всех классах?

#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. Спасибо, это работает, и теперь я понимаю процесс. Каким будет решение, если мне нужно, чтобы файл свойств находился где-то в файловой системе вне пакета или вне пути к классу?