Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как прочитать файл настроек .properties

Короткий ответ

Пусть есть файл app.properties — строки вида ключ=значение, комментарии начинаются с #:

# server settings
server.port=8080
app.name=Coffee Shop

Класс Properties читает такой файл через load():

void main() throws IOException {
    var props = new Properties();
    try (var reader = Files.newBufferedReader(Path.of("app.properties"))) {
        props.load(reader);
    }
    IO.println(props.getProperty("app.name"));
    IO.println(props.getProperty("server.port"));
}

Результат:

Coffee Shop
8080

Значения по умолчанию и числа

Второй аргумент getProperty() — значение, если ключа нет. Числа разберите через parseInt():

void main() throws IOException {
    var props = new Properties();
    try (var reader = Files.newBufferedReader(Path.of("app.properties"))) {
        props.load(reader);
    }
    int port = Integer.parseInt(props.getProperty("server.port", "80"));
    String mode = props.getProperty("app.mode", "production");
 
    IO.println(port + 1);
    IO.println(mode);
}

Результат:

8081
production

Переменные окружения

Секреты вроде паролей к базе лучше хранить не в файле, а в переменных окружения. System.getenv() возвращает null, если переменной нет:

void main() {
    String url = Objects.requireNonNullElse(System.getenv("MY_APP_DB_URL"), "jdbc:h2:mem:test");
    IO.println(url);
}

Результат:

jdbc:h2:mem:test

Частая ошибка

Читать файл через props.load(InputStream). Этот вариант читает файл в кодировке ISO-8859-1, и кириллица превращается в мусор. Передавайте Reader из Files.newBufferedReader() — он читает UTF-8.

Функции из этого ответа

  • BufferedReader — Читает текст построчно с буферизацией — классический способ обработки больших файлов.
  • Map.getOrDefault() — Возвращает значение по ключу или запасное значение, если ключа нет.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.