Java 関数の呼び出し中に、「システムは指定されたパスを見つけることができません」という例外が発生しますcreateTempFile("test", "test")
。グーグルで試してみましたが、うまくいきませんでした。Javaがデフォルトの一時パスをどこから取得し、どのように見つからないかを知っている人はいますか? Windows 変数は正しいようで、それらを変更しても Java には影響しません。
3 に答える
Javaがデフォルトの一時パスを取得する場所を知っている人はいますか
プロパティから読み取られjava.io.tmpdir
ます。
Files.createTempFile("test", "test");
基本的java.nio.file.TempFileHelper.createTempFile(null, prefix, suffix, attrs);
に を呼び出しますjava.nio.file.TempFileHelper.create(dir, prefix, suffix, false, attrs);
。そこで、dir
が null の場合tmpdir
、次のように宣言されているがに設定されます。
private static final Path tmpdir =
Paths.get(doPrivileged(new GetPropertyAction("java.io.tmpdir")));
@Joni からの回答に示されているように、プロパティを明示的に設定できます。明示的に設定しない場合、JVM は起動時にプラットフォーム固有のデフォルト値に初期化します。java.io.tmpdir を制御する環境変数も参照してください。
そして、どうして見つからないのですか?
プロパティjava.io.tmpdir
が無効なディレクトリを指している場合、一時ファイルは作成できません。
デフォルト値の取得方法とはjava.io.tmpdir
関係なく、JVM の起動時にシステム プロパティを設定することで、一時ファイル ディレクトリを設定できます。
java -Djava.io.tmpdir=/path/to/where/ever/you/like YourClass
デフォルト値の由来を知りたい場合は、JVM のソース コードを読む必要があります。たとえば、Windows 上の OpenJDK は API 関数GetTempPathW
(JDK ソース コードでファイルjava_props_md.c
を検索) を呼び出します。これは、次の方法で環境変数とレジストリのパスを検索します。
この
GetTempPath
関数は、次の順序で環境変数の存在をチェックし、見つかった最初のパスを使用します。
- TMP 環境変数で指定されたパス。
- TEMP 環境変数で指定されたパス。
- USERPROFILE 環境変数で指定されたパス。
- Windows ディレクトリ。
この関数は、パスが存在することを確認したり、現在のプロセスがパスへのアクセス権を持っているかどうかをテストしたりしないことに注意してください。