如何获取环境变量的Java程序修改后的值(这是外部修改)?(How to retrieve the

2019-10-16 15:56发布

是否有可能获取环境变量的Java程序修改后的值?

我试着用System.getenv() 但是,新的价值不是体现在程序。 该方案是这样的:

  1. 该程序将检索的环境变量的值。

  2. 这个变量的值被外部更改,而程序仍在运行。 (这可能是连手工工艺,像例如,在Windows中,用户在我的电脑“的属性变化,从高级选项卡中的值)

  3. 该计划再次获取环境变量的值。

该值被检索的第二次,它应该得到修改后的值。 我发现,使用System.getenv()给我的只有老值。 对此有任何可靠的方法? (这个要求是针对Windows,但很想听到通用的解决方案太)

Answer 1:

据我所知,在过程可视化的环境变量是在创建进程时成立。

后续修改操作系统的变量是不可见的处理相比,谁改变他们等。

然而,根据不同的操作系统上,可能会有一些方法来检索他们。 例如,在Windows操作系统上,它们被保存在注册表中,这样你就可以从中读出。

尝试阅读的关键HKCU\Environment为当前用户变量和关键

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment for system variables.

请参阅有关Windows注册表这个问题进行了有益的类来读取注册表。



Answer 2:

没有进程手表从父环境变量。 即使C程序不“看”的环境变量,因为你需要改变它在这一进程。 当一个进程启动时,它得到了环境的副本从其父。 所以,如果你修改环境变量在父它不会改变子进程的版本。 除非你开始一个新的过程,它得到改变的副本。 我认为这就是最终为什么Java没有看到变化,因为它的行为就像将任何正常的过程。 有充分的理由对这种行为! 如果ENV变量是修改,然后你会进入他们周围的并发问题,你需要定义,当一个进程会“看到”其他进程的这些变化。 这是所有关于锁定,可视性和大多数操作系统不想在早期解决并发问题讨厌。

如果你想两个进程之间共享数据,你必须使用IPC(进程间通信)这样做。 在C地,有几个方法可以做到这管道,共享内存,插槽。 Java的简化IPC到插座,因为它是其他两个本地和远程进程之间的能力和透明度的一个超集。 您可以使用管道与Java进程共享数据,但它会通过标准输入。

底线在Java中启动插座,从另一个进程发送数据。



Answer 3:

另外通过@Andrea帕罗迪(+1)来回答我真的可以建议你通过运行外部命令行读取环境echo %MYENV_VAR%和读取输出或读取注册表。

请大家一看这篇文章 ,我展示了如何读取windows的注册表,无需任何外部库。



Answer 4:

在Win 7,这样的事情会得到ENV瓦尔:

Process p = Runtime.getRuntime().exec("cmd.exe /c set");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while( (line = br.readLine()) != null ) {
   String var = br.readLine();
   . . . .

我怀疑它的平台,虽然相关的,所以你的代码的可移植性将是一个问题。



文章来源: How to retrieve the modified value of an environment variable (which is modified externally) in a Java program?