7

私が読んだほとんどすべての記事で、Java ではchdirを使用できないと書かれていました。この質問に対する受け入れられた答えは、Javaではできないと言います。

ただし、ここに私が試したもののいくつかがあります:

geo@codebox:~$ Java -バージョン
Java バージョン「1.6.0_14」
Java(TM) SE ランタイム環境 (ビルド 1.6.0_14-b08)
Java HotSpot(TM) クライアント VM (ビルド 14.0-b16、混合モード、共有)

私が使用しているテストクラスは次のとおりです。

import java.io.*;

public class Ch {
    public static void main(String[] args) {
        System.out.println(new File(".").getAbsolutePath());
        System.setProperty("user.dir","/media");
        System.out.println(new File(".").getAbsolutePath());
    }
}
geo@codebox:~$ pwd
/ホーム/地域
geo@codebox:~$ Java Ch
/ホーム/ジオ/。
/メディア/。

これが機能した理由を説明してください。今後これを使用して、すべてのプラットフォームで同じように動作することを期待できますか?

4

3 に答える 3

12

望ましい答えがnew File(".")得られたからといって、あなたが望んでいることをしているわけではありません。

たとえば、次を試してください。

new FileOutputStream("foo.txt").close();

それはどこで終わるのですか?私の Windows ボックスでは、new File(".").getAbsolutePath()に基づいて動き回っていますがuser.dirfoo.txtは常に元の作業ディレクトリに作成されます。現在の作業ディレクトリを参照しないuser.dirような設定は、単にトラブルを求めているだけだと思います。new File(".")

于 2009-08-05T18:10:31.983 に答える
7

見積もり:

user.dir プロパティは、VM の起動時に作業ディレクトリに設定されます。このプロパティを変更したり、コマンドラインで設定したりしないでください。その場合、user.dir が作業ディレクトリであり、VM の存続期間中に変更されないことを前提とする実装の場所があるため、一貫性のない動作が見られます。

ディスカッションはこちら

于 2009-08-05T18:18:14.700 に答える
2

File.getAbsoluteFile()は、VMの起動時のプロセスの作業ディレクトリのコピーであるuser.dirシステムプロパティを調べているだけです。

より良いテストは、プロセスの作業ディレクトリが実際に変更されていることを確認することです。これを行う方法はプラットフォームによって異なりますが、Linuxでは次のようにすることができます。

$  ls -l /proc/18037/cwd
lrwxrwxrwx 1 laurence laurence 0 2009-08-05 11:16 /proc/18037/cwd -> /home/laurence/

ここで、「18037」は問題のプロセスのpidです。これを行うと、user.dirを更新しても、プロセスの作業ディレクトリは実際には変更されないことがわかると思います。

于 2009-08-05T18:21:56.330 に答える