Как прочитать файл настроек .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() — Возвращает значение по ключу или запасное значение, если ключа нет.