Управление переменными среды в Java

Введение Переменные называются ячейками памяти. Их ценности сохраняются в памяти, которую мы обычно не можем вспомнить, поскольку они не подходят для людей и меняются местами. Хотя, если мы назовем эту ячейку памяти, например, a, ее будет намного легче запомнить. Переменные среды во многом похожи на обычные программные переменные, за исключением того, что они устанавливаются где-то вне программы. Это может использоваться операционной системой, JVM, микросервисом, который использует наша программа, и т. Д. Точнее, это пара ключ / значение.

Вступление

Переменные называются ячейками памяти. Их ценности сохраняются в памяти, которую мы обычно не можем вспомнить, поскольку они не подходят для людей и меняются местами. Хотя, если мы назовем эту ячейку памяти, например, 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 и выполнили команды, которые полагаются на переменные среды.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus