System.getenv: примеры (JAVA)
System.getenv(String name): StringОсновное описание
Метод System.getenv() из класса java.lang.System используется для доступа к переменным окружения операционной системы. Переменные окружения содержат параметры среды, в которой выполняется Java-процесс (например, путь к временной папке, имя пользователя, домашний каталог).
Метод имеет две перегрузки:
- System.getenv(String name) – принимает один аргумент name (тип String), имя переменной окружения. Возвращает значение этой переменной в виде строки (String). Если переменная с таким именем не задана, возвращается null.
- System.getenv() – без аргументов, возвращает неизменяемую копию карты (Map<String, String>), содержащей все текущие переменные окружения. Ключи и значения – строки. Карту нельзя модифицировать.
Примеры использования
// Получить значение одной переменной
String path = System.getenv("PATH");
System.out.println(path);
/usr/local/bin:/usr/bin:/bin (пример вывода)
// Получить все переменные окружения
Map<String, String> env = System.getenv();
for (Map.Entry<String, String> entry : env.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
JAVA_HOME = /usr/lib/jvm/java-11-openjdk HOME = /home/user ... (все переменные)
// Обработка отсутствующей переменной
String myVar = System.getenv("MY_SECRET");
if (myVar == null) {
System.out.println("Переменная не задана");
}
Переменная не задана
// Вывод с указанием типа
Object envMap = System.getenv();
System.out.println(envMap.getClass());
class java.util.Collections$UnmodifiableMap
Альтернативы в Java
Похожая функция – System.getProperty(String key). Она получает системные свойства Java VM (например, user.home, java.version). Отличия:
- System.getenv обращается к окружению ОС, System.getProperty – к настройкам JVM.
- Системные свойства задаются через флаг -D при запуске JVM, а переменные окружения – до запуска.
- Для получения путей к домашней папке пользователя на разных ОС лучше использовать System.getProperty("user.home") из-за переносимости.
- System.getenv может вернуть разные значения на разных платформах (регистр, разделители путей).
Альтернативы в других языках
PHP: функция getenv() или массив $_ENV. Пример:
$path = getenv('PATH');
echo $path;
/usr/local/bin:/usr/bin
JavaScript (Node.js): свойство process.env – объект со строками. Пример:
console.log(process.env.PATH);
/usr/local/bin:/usr/bin
Python: словарь os.environ. Пример:
import os
print(os.environ.get('PATH'))
/usr/local/bin:/usr/bin
C#: статический метод Environment.GetEnvironmentVariable(). Пример:
string path = Environment.GetEnvironmentVariable("PATH");
Console.WriteLine(path);
/usr/local/bin:/usr/bin
Lua: функция os.getenv(). Пример:
local path = os.getenv("PATH")
print(path)
/usr/local/bin:/usr/bin
Go: функция os.Getenv(). Пример:
package main
import "os"
func main() {
println(os.Getenv("PATH"))
}
/usr/local/bin:/usr/bin
Kotlin: использует тот же Java-метод System.getenv() без изменений.
Отличия от Java: в большинстве языков доступ к окружению регистрозависим на Linux и регистронезависим на Windows (как и в Java). В Python и PHP можно получить все переменные без явного вызова метода (через словарь). В Java карта возвращается неизменяемой, что не везде так.
Типичные ошибки
NullPointerException при передаче null – если вызвать System.getenv(null), будет исключение (в некоторых версиях Java возвращается null, но с Java 9+ выбрасывается NullPointerException). Пример:
String val = System.getenv(null); // NullPointerException
Exception in thread "main" java.lang.NullPointerException: name is null
Различие регистра – на Linux имена чувствительны к регистру, на Windows – нет. Код работающий на одной ОС может не найти переменную на другой.
// Linux: не найдёт 'path' если переменная называется 'PATH'
System.getenv("path"); // возвращает null
Забыли проверить на null – если переменная не задана, метод возвращает null, попытка использовать её без проверки ведёт к NullPointerException.
String home = System.getenv("HOME");
int len = home.length(); // NullPointerException если HOME не задана
Изменения в последних версиях
Метод System.getenv() не претерпел значительных изменений. Основные моменты:
- В Java 9 поведение при передаче null в System.getenv(String) было строго определено – теперь выбрасывается NullPointerException (ранее мог возвращать null).
- Возвращаемая карта всегда является неизменяемой копией, что гарантируется с Java 1.5.
- В Java 8 и более новых версиях нет изменений.
- Начиная с Java 10, при наличии SecurityManager может возникнуть SecurityException (хотя на практике используется редко).
Расширенные примеры
Пример 1: Значение по умолчанию
String dbUrl = System.getenv("DATABASE_URL");
if (dbUrl == null) {
dbUrl = "jdbc:mysql://localhost:3306/default";
}
Пример 2: Фильтрация переменных по префиксу
Map<String, String> env = System.getenv();
env.entrySet().stream()
.filter(e -> e.getKey().startsWith("MY_APP_"))
.forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));
Пример 3: Использование с ProcessBuilder
ProcessBuilder pb = new ProcessBuilder("mycommand");
Map<String, String> envMap = pb.environment();
envMap.putAll(System.getenv()); // копирование текущего окружения
envMap.put("MY_VAR", "value");
pb.start();
Пример 4: Получение всех переменных и их сортировка
Map<String, String> env = System.getenv();
new TreeMap<>(env).forEach((k, v) -> System.out.println(k + " = " + v));
Пример 5: Проверка наличия переменной
boolean hasJavaHome = System.getenv().containsKey("JAVA_HOME");
System.out.println(hasJavaHome);
Пример 6: Работа с разделителями пути
String path = System.getenv("PATH");
String sep = System.getProperty("path.separator");
String[] dirs = path.split(sep);
for (String dir : dirs) {
System.out.println(dir);
}
Пример 7: Получение значения и его преобразование
String timeoutStr = System.getenv("TIMEOUT_SECONDS");
int timeout = timeoutStr != null ? Integer.parseInt(timeoutStr) : 60;