是否有可能获取环境变量的Java程序修改后的值?
我试着用System.getenv()
但是,新的价值不是体现在程序。 该方案是这样的:
该程序将检索的环境变量的值。
这个变量的值被外部更改,而程序仍在运行。 (这可能是连手工工艺,像例如,在Windows中,用户在我的电脑“的属性变化,从高级选项卡中的值)
该计划再次获取环境变量的值。
该值被检索的第二次,它应该得到修改后的值。 我发现,使用System.getenv()
给我的只有老值。 对此有任何可靠的方法? (这个要求是针对Windows,但很想听到通用的解决方案太)
据我所知,在过程可视化的环境变量是在创建进程时成立。
后续修改操作系统的变量是不可见的处理相比,谁改变他们等。
然而,根据不同的操作系统上,可能会有一些方法来检索他们。 例如,在Windows操作系统上,它们被保存在注册表中,这样你就可以从中读出。
尝试阅读的关键HKCU\Environment
为当前用户变量和关键
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment for system variables.
请参阅有关Windows注册表这个问题进行了有益的类来读取注册表。
没有进程手表从父环境变量。 即使C程序不“看”的环境变量,因为你需要改变它在这一进程。 当一个进程启动时,它得到了环境的副本从其父。 所以,如果你修改环境变量在父它不会改变子进程的版本。 除非你开始一个新的过程,它得到改变的副本。 我认为这就是最终为什么Java没有看到变化,因为它的行为就像将任何正常的过程。 有充分的理由对这种行为! 如果ENV变量是修改,然后你会进入他们周围的并发问题,你需要定义,当一个进程会“看到”其他进程的这些变化。 这是所有关于锁定,可视性和大多数操作系统不想在早期解决并发问题讨厌。
如果你想两个进程之间共享数据,你必须使用IPC(进程间通信)这样做。 在C地,有几个方法可以做到这管道,共享内存,插槽。 Java的简化IPC到插座,因为它是其他两个本地和远程进程之间的能力和透明度的一个超集。 您可以使用管道与Java进程共享数据,但它会通过标准输入。
底线在Java中启动插座,从另一个进程发送数据。
另外通过@Andrea帕罗迪(+1)来回答我真的可以建议你通过运行外部命令行读取环境echo %MYENV_VAR%
和读取输出或读取注册表。
请大家一看这篇文章 ,我展示了如何读取windows的注册表,无需任何外部库。
在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?