アプリ版:「スタンプのみでお礼する」機能のリリースについて

表題通りですが、ディレクトリが以下の構造だとします。

(A)
 |
 |---ABC.java
 |---(B)
     |
     |---DEF.java

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

A 回答 (6件)

まず、Javaは実行しているディレクトリは関係ないので勘違いしないように注意して下さい。



質問の内容ですが、ソースのディレクトリを指しているのでしょうか?
それとも、ライブラリのあるクラスパスを指しているのでしょうか?
前者ですと、Javaの実行とは無関係なのでパスをとることは出来ません。
後者だとすると、

DEF.class.getResource(パス)
で、DEFからの相対パスのリソースを取得できます。

たとえば、DEF.classとおなじディレクトリにあるhoge.propertiesのリソースを取得するばあいは、
DEF.class.getResource("hoge.properties")でできます。

残念ながら、(B)のパスを取得することはできません。
    • good
    • 0
この回答へのお礼

これは、どうやって利用するのでしょうか?
どんなにそれらしい記述をしてもnullが返ってくるのですが・・・。
ABC.classとDEF.classしかなく、メソッドも1つしかない場合にも
利用可能ですか?

調べてもサンプルらしきものも見つかりませんでした;;
Java初心者なもので、わけわからず済みません><

お礼日時:2006/05/27 20:05

初心者なのは構わないんだけど、何をやりたいのか自分でもよく分かっていないというのではこちらとしても答えようがないので……



DQ9 さんも言及されてますが、とりあえず、次の三つの違いについて勉強する必要があると思われます。
* カレントディレクトリ
* ソースファイルがあるディレクトリ
* クラスファイルがあるディレクトリ (=クラスパス)

この回答への補足

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

を取得したいです。

補足日時:2006/05/27 21:57
    • good
    • 0

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

この回答への補足

【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が存在するパスを取得したいのですが、
可能でしょうか?
フォルダ構成は質問にある通りです。

補足日時:2006/05/27 22:00
    • good
    • 0

#1でも回答しましたが、


ディレクトリそのものを取得することはできません。

取得するとすれば、ルートパスからの相対パスでやるしかないでしょう。

Javaの実行時は、クラスローダーを使ってライブラリ検索をしてるので、実行時のフォルダ構成は意識しません。
このへんは、かなりややこしいので一長一短で理解するのは難しいと思います。
    • good
    • 1
この回答へのお礼

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

お礼日時:2006/05/27 22:20

一般的に言うと、


クラスファイルはディレクトリに置いてあるかもしれないし、
JARアーカイブに入っているかもしれないし、
ネットワークの向こうにあるかもしれないし、
あるいはクラスファイルは存在せず、単なるバイト配列からクラスを生成してるかもしれません。
私個人の意見ですが、
クラスファイルがディレクトリ内にあるという前提でプログラムを書くのは、
あまり良くないと思います。

それはともかく、

取得した(B)のディレクトリをどのように利用するのか、
ディレクトリを取得する目的を説明していただければ、
何か他の方法がアドバイスできるかもしれません。

クラスローダの仕組みを理解すれば
いちおうディレクトリを取得できると思いますが、
かなりめんどくさそうです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
色んなパターンがあるのですね@@;
Java、深い・・・(笑)

目的は、(B)配下にある自分以外の全てのクラスファイルから
特定のメソッドを実行させる事にあります。

お礼日時:2006/05/28 02:10

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だった場合の保証はありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/01 23:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!