- ベストアンサー
実行中ファイルのディレクトリを知りたい
表題通りですが、ディレクトリが以下の構造だとします。 (A) | |---ABC.java |---(B) | |---DEF.java ABCでパッケージ(B)を利用した時、 (B)パッケージ内クラスDEF内では、(B)のディレクトリを取得したいのですが、 System.getProperty("user.dir"); ですと(A)のディレクトリを取得してしまいます。 (B)のディレクトリを取得するにはどうしたら良いのでしょうか? 宜しくご教示願います。
- みんなの回答 (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だった場合の保証はありません。
その他の回答 (5)
- Gishi
- ベストアンサー率57% (11/19)
一般的に言うと、 クラスファイルはディレクトリに置いてあるかもしれないし、 JARアーカイブに入っているかもしれないし、 ネットワークの向こうにあるかもしれないし、 あるいはクラスファイルは存在せず、単なるバイト配列からクラスを生成してるかもしれません。 私個人の意見ですが、 クラスファイルがディレクトリ内にあるという前提でプログラムを書くのは、 あまり良くないと思います。 それはともかく、 取得した(B)のディレクトリをどのように利用するのか、 ディレクトリを取得する目的を説明していただければ、 何か他の方法がアドバイスできるかもしれません。 クラスローダの仕組みを理解すれば いちおうディレクトリを取得できると思いますが、 かなりめんどくさそうです。
お礼
ありがとうございます。 色んなパターンがあるのですね@@; Java、深い・・・(笑) 目的は、(B)配下にある自分以外の全てのクラスファイルから 特定のメソッドを実行させる事にあります。
#1でも回答しましたが、 ディレクトリそのものを取得することはできません。 取得するとすれば、ルートパスからの相対パスでやるしかないでしょう。 Javaの実行時は、クラスローダーを使ってライブラリ検索をしてるので、実行時のフォルダ構成は意識しません。 このへんは、かなりややこしいので一長一短で理解するのは難しいと思います。
お礼
有難うございます。 ん~、出来れば急ぎで作りたかったのですが、 難しそうなので据え置きし、ClassLoaderについて 勉強してみます。
どういうフォルダ構成になっていて、どういうことをしたいのか具体的に回答してくれるとコードを提示してあげれるかもしれません。
補足
【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)
初心者なのは構わないんだけど、何をやりたいのか自分でもよく分かっていないというのではこちらとしても答えようがないので…… DQ9 さんも言及されてますが、とりあえず、次の三つの違いについて勉強する必要があると思われます。 * カレントディレクトリ * ソースファイルがあるディレクトリ * クラスファイルがあるディレクトリ (=クラスパス)
補足
ABC.classからDEF.classをインポート、実行します。 DEF.classはDEF.classが保存されている絶対パス --->DEF.classからみたらカレントディレクトリ --->DEF.classからみたらソースが保存されているディレクトリ を取得したいです。
まず、Javaは実行しているディレクトリは関係ないので勘違いしないように注意して下さい。 質問の内容ですが、ソースのディレクトリを指しているのでしょうか? それとも、ライブラリのあるクラスパスを指しているのでしょうか? 前者ですと、Javaの実行とは無関係なのでパスをとることは出来ません。 後者だとすると、 DEF.class.getResource(パス) で、DEFからの相対パスのリソースを取得できます。 たとえば、DEF.classとおなじディレクトリにあるhoge.propertiesのリソースを取得するばあいは、 DEF.class.getResource("hoge.properties")でできます。 残念ながら、(B)のパスを取得することはできません。
お礼
これは、どうやって利用するのでしょうか? どんなにそれらしい記述をしてもnullが返ってくるのですが・・・。 ABC.classとDEF.classしかなく、メソッドも1つしかない場合にも 利用可能ですか? 調べてもサンプルらしきものも見つかりませんでした;; Java初心者なもので、わけわからず済みません><
お礼
ありがとうございます。 応用して色々試してみようと思います。