Вступление
Переменные называются ячейками памяти. Их ценности сохраняются в памяти,
которую мы обычно не можем вспомнить, поскольку они не подходят для
людей и меняются местами. Хотя, если мы назовем эту ячейку памяти,
например, a
, ее будет намного легче запомнить.
Переменные среды во многом похожи на обычные программные переменные, за исключением того, что они устанавливаются где-то вне программы. Это может использоваться операционной системой, JVM, микросервисом, который использует наша программа, и т. Д.
Точнее, это пары ключ / значение , где ключ - это то, что можно представить как имя переменной среды, а значение - это, в общем, значение. Их значения всегда являются строками.
Когда люди ссылаются на переменные среды, они обычно имеют в виду те,
которые установлены операционной системой. Вероятно, в прошлом вам
приходилось иметь дело с PATH
и JAVA_HOME
- это переменные среды.
Переменные среды различаются в зависимости от операционной системы, и иногда бывает сложно создать переносимые программы, которые полагаются на них, но ничто не делает их трудными для работы.
У переменных окружения операционной системы есть аналог в мире JVM - Свойства . Они выходят за рамки этой статьи, но следует упомянуть, поскольку они представляют собой довольно похожую концепцию в меньшем масштабе.
Запрос переменных среды
Ваша операционная система хранит свои переменные среды в виде пар ключ /
значение. Вы можете использовать System.getenv()
для получения этих
значений. Если вы используете его без аргумента, вы получите Map
в
качестве возвращаемого значения:
Map<String, String> env = System.getenv();
for(String envName : env.keySet()){
System.out.println(String.format("%s : %s", envName, env.get(envName)));
}
Вот усеченный вид результатов:
PROCESSOR_ARCHITECTURE : AMD64
MIC_LD_LIBRARY_PATH : C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic
PSModulePath : C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
SystemDrive : C:
AWE_DIR : D:\Awesomium\1.6.6\
FPS_BROWSER_USER_PROFILE_STRING : Default
PATHEXT : .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
DriverData : C:\Windows\System32\Drivers\DriverData
HerokuPath : E:\Heroku
ProgramData : C:\ProgramData
ProgramW6432 : C:\Program Files
Вы также можете передать ему String
соответствующую имени (ключу)
переменной, и она вернет значение соответствующей переменной в виде
String
:
System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));
8
ProcessBuilder и окружающая среда
В Java есть Process
для работы с процессами операционной системы.
Чтобы упростить создание процесса, существует класс
ProcessBuilder, и
вы можете просто «добавлять» команды к его экземпляру для запуска.
У каждого процесса может быть своя собственная среда. Ваша программа будет иметь среду, установленную операционной системой, но программы, которые вы запускаете как процессы, могут иметь измененную среду, созданную вручную .
Чтобы отредактировать среду, вы должны получить ссылку на
ProcessBuilder
объекта ProcessBuilder с помощью геттера
environment()
Как и при чтении переменных среды из System
, вы
получите Map
и затем сможете изменить ее с помощью обычных операций
Map
После создания среды мы создадим команду. Это зависит от операционной системы. Здесь у нас есть элементарная проверка, которая адекватно изменяет команду:
// Setting up the environment...
ProcessBuilder processBuilder = new ProcessBuilder();
Map<String, String> env = processBuilder.environment();
env.put("PING_WEBSITE", "stackabuse.com");
if (System.getProperty("os.name").startsWith("Windows")) {
processBuilder.command("cmd.exe", "/c", "ping -n 3 %PING_WEBSITE%")
} else {
processBuilder.command("/bin/bash", "-c", "ping $PING_WEBSITE$");
}
try {
// Starting the process...
Process process = processBuilder.start();
// Reading the output of the process
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
// Catch the exit code of our process
int ret = process.waitFor();
System.out.printf("Program exited with code: %d", ret);
} catch (IOException | InterruptedException e) {
// Handle exception...
e.printStackTrace();
}
Pinging stackabuse.com [172.67.218.223] with 32 bytes of data:
Reply from 172.67.218.223: bytes=32 time=12ms TTL=57
Reply from 172.67.218.223: bytes=32 time=12ms TTL=57
Reply from 172.67.218.223: bytes=32 time=15ms TTL=57
Ping statistics for 172.67.218.223:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 12ms, Maximum = 15ms, Average = 13ms
Program exited with code: 0
Process finished with exit code 0
Мы создали новую переменную окружения PING_WEBSITE
с фиксированным
значением. Вы можете изменить эту программу, чтобы установить значение
PING_WEBSITE
для пользовательского ввода, аргумента командной строки
или чтения значения из файла.
Если вы хотите прочитать « Как анализировать и отображать аргументы командной строки в Java» или « Как получить пользовательский ввод в Java» , мы вам поможем!
Заключение
Мы представили концепцию переменных среды, объяснили, для чего они используются, и аналогичные концепции, а также их системно-зависимый характер.
Затем мы распечатали переменные среды с помощью метода Java
System.getEnv()
, а также создали процессы с помощью ProcessBuilder
и выполнили команды, которые полагаются на переменные среды.