2012-05-03 26 views
0

是否可以在Java程序中检索环境变量的修改值?如何在Java程序中检索环境变量(在外部进行修改)的修改值?

我试过使用System.getenv()。但新的价值并没有体现在这个计划中。场景是这样的:

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

  2. 在程序仍在运行时,此变量的值在外部发生更改。 (它甚至可以是手动过程,例如在Windows中,用户从“我的电脑” - >属性中的“高级”选项卡更改值)

  3. 程序再次检索环境变量的值。

第二次检索到值时,它应该得到修改后的值。我发现使用System.getenv()只给了我旧值。有没有可靠的方法呢? (此要求特定于Windows,但也希望听到一般解决方案)

+1

你在使用什么样的操作系统?它是Windows吗? – AlexR

+0

是的,这个要求是特定于Windows的。 – vaisakh

回答

2

Afaik,进程可见的环境变量是在进程创建时设置的。

对操作系统变量的后续修改对于进行更改的操作不可见。

但是,根据操作系统,可能有一些方法来检索它们。例如。在Windows Os上,它们保存在注册表中,以便您可以从中读取它们。

尝试HKCU\Environment读数的关键是当前用户的变量,关键

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

this question about Windows registry进行了有益的类来读取注册表。

+0

好吧,从来没有想过在注册表中查看,将检查。 – vaisakh

1

没有进程监视来自父级的环境变量。即使C程序也不会“观察”环境变量,因为您需要在该过程中对其进行更改。当一个进程启动时,它从它的父节点获得一个环境的副本。因此,如果您修改父级中的环境变量,它不会更改子进程版本。除非你开始一个新的过程,它会得到一个变更的副本。我认为这最终是为什么Java没有看到变化,因为它的行为就像任何正常的过程一样。这种行为有很好的理由!如果env变量是可修改的,那么你会遇到并发问题,你需要定义一个进程何时“看到”来自其他进程的变化。这是关于大多数操作系统在早期不想解决的并发性的锁定,可见性和讨厌问题。

如果您想在两个进程之间共享数据,则必须使用IPC(进程间通信)来执行此操作。在C陆上有几种方式来做这些管道,共享内存,套接字。 Java将IPC简化为套接字,因为它是其他两种功能的超集,以及远程和本地进程之间的透明性。您可以使用管道与Java进程共享数据,但它可能是通过stdin。

底线在Java中启动套接字并从其他进程发送数据。

+0

正确,并发问题确实出现。尽管如此,我们特别要求用户更改该值并返回到程序。为此,IPC可能是一种矫枉过正......肯定会把这个选择作为一个后备方案。 – vaisakh

+0

这实际上意味着重新启动应用程序。提示用户然后关闭进程并重新启动它。中提琴你会看到新的价值。这可以通过可以重新启动Java进程的看门狗类型进程轻松完成。 – chubbsondubs

1

除了@Andrea Parodi(+1)的回答外,我真的可以推荐你通过运行外部命令行echo %MYENV_VAR%读取环境并读取输出或读取注册表。

请看看this article,看看如何在没有任何外部库的情况下阅读Windows注册表。

+0

阅读注册表看起来很有前途。现在我想到了,我们的框架为我们提供了访问注册表值的API。我最好看看它。感谢您的想法!(+ 1) – vaisakh

1

在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(); 
    . . . . 

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

+0

好的,'set'命令也可以在Windows XP中运行。所以这不是问题,但我将不得不解析输出才能获得价值。不过值得一试。 – vaisakh

+0

如果感觉工作太多,并且您正在寻找特定的已知变种,请尝试使用'cmd.exe/c echo%YOUR_VAR_NAME%'。我以为你想检测到所有的变化。 – mazaneicha

+0

是的,这是一个已知的值;只是一个变量 – vaisakh