web-dev-qa-db-ja.com

System.getProperty( "Java.io.tmpdir")が "c:\ temp"を返した場合

System.getProperty("Java.io.tmpdir")がいつ"c:\temp"を返すのかという点に興味があります。によると Java.io.FileJava Docs -

デフォルトの一時ファイルディレクトリは、システムプロパティJava.io.tmpdirによって指定されます。 UNIXシステムでは、このプロパティのデフォルト値は通常 "/ tmp"または "/ var/tmp"です。 Microsoft Windowsシステムでは、通常 "c:\ temp"です。 Java仮想マシンが呼び出されたときにこのシステムプロパティに異なる値が与えられることがありますが、このプロパティへのプログラムによる変更がこのメソッドで使用される一時ディレクトリに影響を与えることは保証されていません。

しかし私の場合は

System.out.println(System.getProperty("Java.io.tmpdir"));

常に返品

C:\Users\admin\AppData\Local\Temp\ i.e. %TEMP%

どのような条件で"c:\temp"が返されますか?

編集済み:%TEMP%をC:\ Tempに変更すると、C:\ Tempになります。ただし、ドキュメントにはC:\ Tempではなくc:\ Tempが表示されます。

98
Ashish Pancholi

MS Windowsでは、一時ディレクトリは環境変数TEMPによって設定されます。 XPでは、一時ディレクトリはユーザごとにLocal Settings\Tempに設定されていました。

TEMP環境変数をC:\tempに変更すると、実行したときと同じ結果になります。

System.out.println(System.getProperty("Java.io.tmpdir"));

116

設定した場合

-Djava.io.tmpdir=C:\temp
31
Peter Lawrey

一方で、System.getProperty("Java.io.tmpdir")命令を呼び出すと、JavaはWin32 APIの関数GetTempPathを呼び出します。によると MSDN

GetTempPath関数は、次の順序で環境変数の存在を確認し、見つかった最初のパスを使用します。

  1. TMP環境変数で指定されたパス。
  2. TEMP環境変数で指定されたパス。
  3. USERPROFILE環境変数で指定されたパス。
  4. Windowsディレクトリ.

一方、 TMPTEMPが共存する理由の歴史的理由 を確認してください。本当に読む価値があります。

27
Zakaria

%TEMP%環境変数の値は多くの場合ユーザー固有であり、Windowsは現在ログインしているユーザーアカウントに関してそれを設定します。たとえば、プロセスがSYSTEMLOCALSYSTEM、またはその他の組み込みアカウントでサービスとして実行されている場合や、AppPool IDを指定してIIS applicationによってCreate)によって呼び出される場合など、一部のユーザーアカウントにユーザープロファイルがありません。ユーザープロファイルオプションが無効になっています。そのため、%TEMP%変数を明示的に上書きしなくても、Windowsはc:\tempまたはc:\windows\tempフォルダを使用することがあります。さらに重要なことは、このディレクトリへのアクセス権がプロセスにないことです。

0
Maciek