2

Javaプログラムで環境変数の変更された値を取得することは可能ですか?

使ってみSystem.getenv()ました。ただし、新しい値はプログラムに反映されません。シナリオは次のとおりです。

  1. プログラムは環境変数の値を取得します。

  2. この変数の値は、プログラムの実行中に外部から変更されます。(たとえば、Windowsの場合、ユーザーが[マイコンピュータ]-> [プロパティ]の[詳細設定]タブから値を変更するなど、手動のプロセスでもかまいません)

  3. プログラムは、環境変数の値を再度取得します。

2回目に値が取得されると、変更された値が取得されます。System.getenv()使用すると古い値しか得られないことがわかりました。このための信頼できる方法はありますか?(この要件はWindowsに固有ですが、一般的な解決策も聞きたいです)

4

4 に答える 4

2

プロセスに表示される環境変数は、プロセスの作成時に設定されます。

OS 変数に対するその後の変更は、それらを変更したプロセス以外には表示されません。

ただし、OS によっては、それらを取得する方法がいくつかある場合があります。たとえば、Windows OS では、それらはレジストリに保持されるため、それらから読み取ることができます。

HKCU\Environment現在のユーザー変数のキーとキーを読み取ってみてください

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

レジストリを読み取るための便利なクラスについては、Windows レジストリに関するこの質問を参照してください。

于 2012-05-03T15:09:27.113 に答える
2

親からの環境変数を監視するプロセスはありません。そのプロセスで環境変数を変更する必要があるため、C プログラムでさえ環境変数を「監視」しません。プロセスが起動すると、その親から環境のコピーが取得されます。したがって、親の環境変数を変更しても、子プロセスのバージョンは変更されません。変更のコピーを取得する新しいプロセスを開始しない限り。Java は通常のプロセスと同じように動作するため、最終的に Java が変更を認識しないのはそのためだと思います。この動作には正当な理由があります。環境変数が変更可能な場合、それらの周りで同時実行の問題が発生し、プロセスが他のプロセスからの変更をいつ「見る」かを定義する必要があります。これはすべて、ロック、可視性、

2 つのプロセス間でデータを共有する場合は、IPC (プロセス間通信) を使用する必要があります。C ランドでは、このパイプ、共有メモリ、ソケットを実行する方法がいくつかありました。Java は、他の 2 つの機能のスーパーセットであり、リモート プロセスとローカル プロセス間の透過性があったため、IPC をソケットに単純化しました。パイプを使用して Java プロセスとデータを共有できますが、それは stdin を介して行われます。

要するに、Java でソケットを開始し、別のプロセスからデータを送信します。

于 2012-05-03T15:09:28.693 に答える
1

@Andrea Parodi (+1) による回答に加えて、外部コマンド ラインecho %MYENV_VAR%を実行して環境を読み取り、出力を読み取るか、レジストリを読み取ることをお勧めします。

外部ライブラリなしで Windows レジストリを読み取る方法を示すこの記事をご覧ください。

于 2012-05-03T15:17:08.227 に答える
1

Win 7 では、次のようにして環境変数を取得します。

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

ただし、プラットフォームに依存していると思われるため、コードの移植性が問題になります。

于 2012-05-03T15:20:53.603 に答える