• ベストアンサー

プログラムから起動ディレクトリを知るには?

Jar または class 自身が起動したディレクトリをプログラム内から取得したいのですが、どうすればよいでしょう? つまり、C の argv[0] にあたる絶対ディレクトリパスを取得したいのです。.jar と同じディレクトリに .properties などを置いて、保存・読み込みするようにするのが目的です。

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんにちは。  deadlockさんの方法を参考にサンプルを作ってみました。  でも、複雑でトリッキーになってしまいました。  もっと、シンプルな方法があればいいのですが・・・。 (コンパイルするときは、全角スペースを半角スペースに変換してからにしてください) package hoge.hoge; import java.net.*; import java.io.*; import java.util.regex.*; public class Test {   public static void main(String[] args){     Test test = new Test();     Class testClass = test.getClass();     //リソースとして自分自身を探す。これなら、間違いなくあるはず。     URL url = testClass.getResource("Test.class");          File dir = null;          String protocol = url.getProtocol();          //Jar化されている場合は、     if (protocol.equals("jar")) {              //URLの要らない部分を取って、       Pattern p = Pattern.compile("(file:/.*)!/");       Matcher m = p.matcher(url.toString());       if (!m.find()) {         System.out.println("find失敗");         System.exit(1);       }              //Jarファイルの場所を特定し、       File jarFile = null;       try {         jarFile = new File(new URI(m.group(1)));       }       catch (URISyntaxException ex) {         ex.printStackTrace();         System.exit(1);       }              //その親ディレクトリ。       dir = jarFile.getParentFile();     }          //Jar化されていない場合は、     else if (protocol.equals("file")) {              //クラスファイルの場所を特定し、       File classFile = null;       try {         classFile = new File(new URI(url.toString()));       }       catch (URISyntaxException ex) {         ex.printStackTrace();         System.exit(1);       }              Package pack = testClass.getPackage();              //無名パッケージの場合は、       if (pack == null) {                  //その親ディレクトリ。         dir = classFile.getParentFile();       }              //パッケージ名がある場合は、       else {                  //パッケージの階層の分だけ上に上がる。         String packName = pack.getName();         String[] words = packName.split("\\.");         dir = classFile.getParentFile();         for (int i = 0; i < words.length; i++) {           dir = dir.getParentFile();         }       }     }     else {       System.out.println("Fileオブジェクトにできません");       System.exit(1);     }     System.out.println(dir);   } }

hemlock
質問者

お礼

こんにちは。わざわざプログラムを作っていただきありがとうございます。これで目的に到達できそうです。 Jar でも使えるとは思っていませんでした。方法が色々あるもの、と勉強になりました。

その他の回答 (3)

noname#49664
noname#49664
回答No.3

これ、プラットフォーム(OS)によっては動作が違うのかもしれませんが・・。 File f = new File("Sample.class"); String fpath = f.getAbsolutePath(); これで、絶対パスが得られませんか?  基本的にファイル名だけを指定してFileを取得すると、起動クラスがあるディレクトリ内からそれを探してFileを得ることができますよね? ならば、起動クラス(またはJar)のファイル自身のFileを作ってgetAbsolutePathすれば得られるように思いますが・・。  これでもしうまくいくなら、後はそこからディレクトリのパスを得るのは簡単でしょう。

hemlock
質問者

お礼

ありがとうございます。 Windows 上で試してみたのですが、 new File(name) したときに name が絶対パスで与えられていない場合、 Java は name が実在する/しないに関わらず、カレントディレクトリにある、と想定するようです。で、getAbsolutePath() は Java コマンドをたたいたディレクトリが返ってきて、起動クラスがあるディレクトリにはなりませんでした。 これはいけそうかと自分も思いましたが、、残念です。

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.2

Classファイルなどの絶対パスとは異なりますが、 Class#getResource(String) Class#getResourceAsStream(String) を使用されてはどうでしょう。クラスパス内からリソース(この場合、.propertiesファイル)を 取得できます。 public class Foo { public static void main(String[] args) throws IOException { InputStream in = Foo.class.getResourceAsStream("hoge.properties"); Properties prop = new Properties(); prop.load(in); prop.list(System.out); } } として、指定したプロパティファイルを以下のディレクトリ構成になるように配置してください。 ┣Foo.class ┗hoge.properties ※「クラスパスから探す」なので、クラスパス上であればほかの場所でもかまいません。  ただ、最初の動作確認のときは同じところに置いた方が分かりやすいでしょう。

hemlock
質問者

お礼

ありがとうございます。設定ファイルを .class と同じ場所に置ける、という意味ではこの方法がよさそうですね。絶対パスについては、VM にアクセスするしか判別方法はないのかも知れません。。

回答No.1

System.getProperty("user.dir"); で取得できます。 いや、そういうと語弊が…。 javaコマンドを叩いたディレクトリが取得できますね。 D:\hoge1>java hogepackage.hoge とすると D:\hoge1 というディレクトリが取得できます。 でも起動したクラスの場所は D:\hoge1\hogepackage となりますよね。 参考になれば幸いです。

hemlock
質問者

お礼

ありがとうございます。システムプロパティは一通り漁ってみたのですが、user.dir は起動したカレントディレクトリになってしまいますね。 C:\user>java -jar c:\bin\foo.jar としたときに、foo.jar のプログラム中で c:\bin を取得したいです。

関連するQ&A