• ベストアンサー

実行中ファイルのディレクトリを知りたい

表題通りですが、ディレクトリが以下の構造だとします。 (A)  |  |---ABC.java  |---(B)      |      |---DEF.java ABCでパッケージ(B)を利用した時、 (B)パッケージ内クラスDEF内では、(B)のディレクトリを取得したいのですが、 System.getProperty("user.dir"); ですと(A)のディレクトリを取得してしまいます。 (B)のディレクトリを取得するにはどうしたら良いのでしょうか? 宜しくご教示願います。

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

  • ベストアンサー
noname#18558
noname#18558
回答No.6

public String[] getCurrentDirClasses() { String className = this.getClass().getName().substring( this.getClass().getPackage().getName().length() + 1 ) + ".class"; URL url = this.getClass().getResource( className ); File dir = new File( url.getPath() ).getParentFile(); String[] files = dir.list( new FilenameFilter() { public boolean accept( File dir, String name ) { return ( name.endsWith( ".class" ) ); } }); return files; } これで、自分のクラスファイルがある同ディレクトリの全てのクラスファイル名をとれます。 ただ、実行されたクラスがjarだった場合の保証はありません。

naktak
質問者

お礼

ありがとうございます。 応用して色々試してみようと思います。

その他の回答 (5)

  • Gishi
  • ベストアンサー率57% (11/19)
回答No.5

一般的に言うと、 クラスファイルはディレクトリに置いてあるかもしれないし、 JARアーカイブに入っているかもしれないし、 ネットワークの向こうにあるかもしれないし、 あるいはクラスファイルは存在せず、単なるバイト配列からクラスを生成してるかもしれません。 私個人の意見ですが、 クラスファイルがディレクトリ内にあるという前提でプログラムを書くのは、 あまり良くないと思います。 それはともかく、 取得した(B)のディレクトリをどのように利用するのか、 ディレクトリを取得する目的を説明していただければ、 何か他の方法がアドバイスできるかもしれません。 クラスローダの仕組みを理解すれば いちおうディレクトリを取得できると思いますが、 かなりめんどくさそうです。

naktak
質問者

お礼

ありがとうございます。 色んなパターンがあるのですね@@; Java、深い・・・(笑) 目的は、(B)配下にある自分以外の全てのクラスファイルから 特定のメソッドを実行させる事にあります。

noname#19197
noname#19197
回答No.4

#1でも回答しましたが、 ディレクトリそのものを取得することはできません。 取得するとすれば、ルートパスからの相対パスでやるしかないでしょう。 Javaの実行時は、クラスローダーを使ってライブラリ検索をしてるので、実行時のフォルダ構成は意識しません。 このへんは、かなりややこしいので一長一短で理解するのは難しいと思います。

naktak
質問者

お礼

有難うございます。 ん~、出来れば急ぎで作りたかったのですが、 難しそうなので据え置きし、ClassLoaderについて 勉強してみます。

noname#18558
noname#18558
回答No.3

どういうフォルダ構成になっていて、どういうことをしたいのか具体的に回答してくれるとコードを提示してあげれるかもしれません。

naktak
質問者

補足

【ABC.java】 import B.*; public class ABC { public static void main(String args[]) { DEF obj = new DEF(); obj.getDirectory(); } } 【DEF.java】 package B; public class DEF { public void getDirectory() { System.out.println(System.getProperty("user.dir")); } } これだと実行したクラスが存在するパスを取得してしまいます。 DEF.classが存在するパスを取得したいのですが、 可能でしょうか? フォルダ構成は質問にある通りです。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

初心者なのは構わないんだけど、何をやりたいのか自分でもよく分かっていないというのではこちらとしても答えようがないので…… DQ9 さんも言及されてますが、とりあえず、次の三つの違いについて勉強する必要があると思われます。 * カレントディレクトリ * ソースファイルがあるディレクトリ * クラスファイルがあるディレクトリ (=クラスパス)

naktak
質問者

補足

ABC.classからDEF.classをインポート、実行します。 DEF.classはDEF.classが保存されている絶対パス --->DEF.classからみたらカレントディレクトリ --->DEF.classからみたらソースが保存されているディレクトリ を取得したいです。

noname#18558
noname#18558
回答No.1

まず、Javaは実行しているディレクトリは関係ないので勘違いしないように注意して下さい。 質問の内容ですが、ソースのディレクトリを指しているのでしょうか? それとも、ライブラリのあるクラスパスを指しているのでしょうか? 前者ですと、Javaの実行とは無関係なのでパスをとることは出来ません。 後者だとすると、 DEF.class.getResource(パス) で、DEFからの相対パスのリソースを取得できます。 たとえば、DEF.classとおなじディレクトリにあるhoge.propertiesのリソースを取得するばあいは、 DEF.class.getResource("hoge.properties")でできます。 残念ながら、(B)のパスを取得することはできません。

naktak
質問者

お礼

これは、どうやって利用するのでしょうか? どんなにそれらしい記述をしてもnullが返ってくるのですが・・・。 ABC.classとDEF.classしかなく、メソッドも1つしかない場合にも 利用可能ですか? 調べてもサンプルらしきものも見つかりませんでした;; Java初心者なもので、わけわからず済みません><

関連するQ&A