System.getenv: примеры (JAVA)

Метод 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: Значение по умолчанию

Пример java
String dbUrl = System.getenv("DATABASE_URL");
if (dbUrl == null) {
    dbUrl = "jdbc:mysql://localhost:3306/default";
}

Пример 2: Фильтрация переменных по префиксу

Пример java
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

Пример java
ProcessBuilder pb = new ProcessBuilder("mycommand");
Map<String, String> envMap = pb.environment();
envMap.putAll(System.getenv()); // копирование текущего окружения
envMap.put("MY_VAR", "value");
pb.start();

Пример 4: Получение всех переменных и их сортировка

Пример java
Map<String, String> env = System.getenv();
new TreeMap<>(env).forEach((k, v) -> System.out.println(k + " = " + v));

Пример 5: Проверка наличия переменной

Пример java
boolean hasJavaHome = System.getenv().containsKey("JAVA_HOME");
System.out.println(hasJavaHome);

Пример 6: Работа с разделителями пути

Пример java
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: Получение значения и его преобразование

Пример java
String timeoutStr = System.getenv("TIMEOUT_SECONDS");
int timeout = timeoutStr != null ? Integer.parseInt(timeoutStr) : 60;

джава System.getenv function comments

En
System.getenv Gets the value of the specified environment variable