2009-08-05 8 views
6

私が読んだほとんどすべての記事は、あなたがJavaでchdirを持つことができないと私に語った。受け入れられた答えはthis questionです。あなたはJavaでそれを行うことはできません。user.dirシステムプロパティがJavaで動作するのはなぜですか?

しかし、ここで私が試したものの一部です:

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()); 
    } 
} 
 
[email protected]:~$ pwd 
/home/geo 
[email protected]:~$ java Ch 
/home/geo/. 
/media/. 

を、これが働いた理由を説明してください:

 
[email protected]:~$ java -version 
java version "1.6.0_14" 
Java(TM) SE Runtime Environment (build 1.6.0_14-b08) 
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing) 

ここで私が使用しているテストクラスです。これからはこれを使用して、すべてのプラットフォームで同じように動作すると思いますか?

答えて

10

ちょうどnew File(".")が希望の答えを出すということは、あなたが望むことをしているということではありません。

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

そのエンドアップを行い
new FileOutputStream("foo.txt").close(); 

? Windowsの場合、user.dirに基づいてnew File(".").getAbsolutePath()が移動しても、元の作業ディレクトリには常にfoo.txtが作成されます。それはuser.dirnew File(".")でないように設定すると私に当てはまります。は現行の作業ディレクトリを参照するだけでトラブルを求めています。

+0

私はそれをテストしなかった:)。 user.dirプロパティの変更がFileクラスに反映されているのを見て、私は停止しました。 – Geo

+1

これはそうです...そう... ... ***間違って***。 :-) –

6

引用:

はuser.dirプロパティは、作業ディレクトリであることをVMの起動時に設定されています。このプロパティを変更したり、コマンドラインで設定したりしないでください。そうした場合、user.dirが作業ディレクトリであり、VMの存続期間中に変更されないと仮定して、インプリメンテーションにいくつかの矛盾した動作が見られます。

議論がhere

1

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の更新時にプロセスの作業ディレクトリが実際に変更されないことがわかります。

関連する問題