Javaで「アプリケーションの置いてあるフォルダのpluginsフォルダ内にあるファイルの一覧」を取得したいと思います。アプリケーションの置いてあるフォルダを取得する方法や、指定したフォルダの中身を取得する方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:2006/06/19 15:28:30
  • 終了:2006/06/23 00:45:23

ベストアンサー

id:copied No.6

copied回答回数11ベストアンサー獲得回数32006/06/22 17:41:50

ポイント65pt

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Class.ht...

java.lang.ClassのgetResourceでURLを取得できるみたいです。引数はクラスパスをルートとした絶対パスまたはクラスファイル位置からの相対パスです。

  • Sample
package sample;
import java.io.*;
import java.net.*;
class Loader {
    public static void main(String[] args) throws URISyntaxException {
        File dir = new File(Loader.class.getResource(args[0]).getFile());
        for (File f : dir.listFiles()) {
	        System.out.println(f.getPath());
	}
    }
}

sample/Loader.class

plugins/a

plugins/b

のように配置すると、

java sample.Loader /plugins

java sample.Loader ../plugins

で、plugins以下のファイルリストを表示します。

その他の回答(5件)

id:lains_you No.1

lains_you回答回数50ベストアンサー獲得回数102006/06/19 16:44:21

ポイント20pt

指定したフォルダの中身を取得する方法

 java.io.FileクラスのlistFilesを使用します。フォルダのみや特定の拡張子を持つファイルのみをリストしたい場合は、抽出条件を記述したFileFilterのサブクラスを引数に与えて実行します。

 http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/io/File.html


 カレントディレクトリのファイル一覧を表示するサンプル。

		File files[] = new File(".").listFiles();
		for (int cnt = 0; cnt < files.length; cnt++) {
			System.out.println(files[cnt].getAbsolutePath());
		}

アプリケーションの置いてあるフォルダを取得する方法

 単純に該当の実行ファイルをファイル検索し、そのFileインスタンスに対してgetParentFileメソッドを実行すると親フォルダが取得できます。

 ただし、単純にファイル検索していくと処理が遅いので、LinuxなどではRuntime.execメソッドでwhichやfindコマンドを実行し、実行ファイルのパスを取得した方が速いです。


 以下、単純に再帰しながら引数で与えられた名称のファイルを探すサンプル。

import java.io.File;
public class Find {
	public static void main(String[] args) {
		System.out.println("Start");
		//特定のファイルを検索する
		File file = find("test.txt");
		if (file != null) {
			System.out.println("ファイルパス:" + file.getAbsolutePath());
			System.out.println("フォルダパス:" + file.getParent());
		}
		System.out.println("End");
	}
	//ルートフォルダから検索
	public static File find(String find) {
		File roots[] = File.listRoots();
		File file;
		for (int cnt = 0; cnt < roots.length; cnt++) {
			if ((file = find(roots[cnt], find)) != null) {
				return file;
			}
		}
		return null;
	}
	//指定フォルダ以下から検索
	public static File find(File parent, String find) {
		File childs[];
		File file;
		childs = parent.listFiles();
		if (childs == null || childs.length == 0) {
			return null;
		}
		for (int cnt = 0; cnt < childs.length; cnt++) {
			if (childs[cnt].isDirectory()) {
				if ((file = find(childs[cnt], find)) != null) {
					return file;
				}
			} else if (childs[cnt].isFile()) {
				if (childs[cnt].getName().endsWith(find)) {
					return childs[cnt];
				}
			}
		}
		return null;
	}
}
id:westfish

アプリケーションの置いてあるフォルダを取得するにはファイル名で検索するしかないのでしょうか。ファイル名が書き換えられていたり、たまたま同じ名前のファイルがあったりすると困りますね…。

前半に関しては教えていただいた方法でうまく行きました。ありがとうございました

2006/06/19 17:23:05
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/06/19 17:05:02

ポイント10pt

[6375] Javaアプリのパスを取得

http://www.hellohiro.com/bbs/79.html

File app = new File(".");

String filePath = app.getAbsolutePath();



ファイル

listメソッド

この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列を返します。

http://www.nextindex.net/java/IO/fileObj.html

例えば、このような感じで列挙できると思います。

File pluginsFile = new File("./plugins");

String[] fileList = pluginsFile.list();

id:westfish

その方法は時間がかからない分、一つめの回答よりはよさそうですが、取得しているのがあくまでカレントフォルダなので正しい値が返ってくるとは限らないのが問題点ですね。

2006/06/19 17:31:44
id:lains_you No.3

lains_you回答回数50ベストアンサー獲得回数102006/06/19 18:13:51

ポイント5pt

 アプリケーション実行ファイルのパスを取得する方法についてですが、DOSコマンドのSET、ASSOCとFTYPEを使用すれば、関連付けがされているアプリケーションのパスなら取得できるかもしれません。

SET      環境変数を表示、設定、または削除します。
 例)SET SystemRoot
  出力)SystemRoot=C:\WINDOWS
 
ASSOC    ファイル拡張子の関連付けを表示または変更します。
 例)ASSOC .txt
 出力).txt=txtfile
 
FTYPE    ファイル拡張子の関連付けで使われるファイルタイプを表示または変更します。
 例)FTYPE txtfiile
 出力)txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1

 上記三つのコマンドを組み合わせれば、.txt拡張子に関連付けられているアプリケーションはC:\WINDOWS\system32\NOTEPAD.EXEであると取得できると思います。


 以下、JavaからDOSのDIRコマンドを実行するサンプル。(Window XP)

try {
	Process process = Runtime.getRuntime().exec("cmd.exe /c dir");
	InputStream is = process.getInputStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(is));
	String line;
	while ((line = br.readLine()) != null)
		System.out.println(line);
} catch (Exception e) {
	e.printStackTrace();
}
id:westfish

すいません、そういうことではなくて、Javaで作成したソフトウェアが自分自身の置かれている絶対パスを知る方法について知りたいのです。

2006/06/19 19:28:01
id:ma-kanoh No.4

ma-kanoh回答回数155ベストアンサー獲得回数42006/06/19 22:16:37

ポイント5pt

http://jpf.sourceforge.net/

Java Plugin Framework

というJavaでプラグインを使わせるタイプのプラグラムを

作る場合のフレームワークがオープンソースになってます。

>JPF provides a runtime engine that dynamically discovers and loads "plug-ins". A plug-in is a structured component that describes itself to JPF using a "manifest". JPF maintains a registry of available plug-ins and the functions they provide

だから、自分で一から実装して細かいことに悩むよりはましかもしれません。

id:westfish

pluginsフォルダの位置の指定以外は実装済みなので今からversion0.10の他人が作ったフレームワークに乗り換えるのはリスクの割にリワードが少ないです。

2006/06/19 22:36:22
id:kenichiice No.5

kenichiice回答回数48ベストアンサー獲得回数72006/06/19 22:17:35

ポイント5pt

Java FAQによれば、自分自身の置かれている絶対パスを取得する汎用的な方法は無いようです。


Java Application で、クラスの .class ファイルの場所を得たいのですが?

http://javafaq.jp/S038.html#S038-01


プラグインを配置するならば、上のページに書かれているようにユーザのホームディレクトリ配下に配置するのがよいのではないかと思います。

id:westfish

むむむ、できないのですか。そうなるとカレントフォルダの取得で代用するのが次善の策かも知れませんね。

ホームディレクトリを使う方法はWindowsユーザーに優しくないので避けたいと思います。

2006/06/19 22:46:13
id:copied No.6

copied回答回数11ベストアンサー獲得回数32006/06/22 17:41:50ここでベストアンサー

ポイント65pt

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Class.ht...

java.lang.ClassのgetResourceでURLを取得できるみたいです。引数はクラスパスをルートとした絶対パスまたはクラスファイル位置からの相対パスです。

  • Sample
package sample;
import java.io.*;
import java.net.*;
class Loader {
    public static void main(String[] args) throws URISyntaxException {
        File dir = new File(Loader.class.getResource(args[0]).getFile());
        for (File f : dir.listFiles()) {
	        System.out.println(f.getPath());
	}
    }
}

sample/Loader.class

plugins/a

plugins/b

のように配置すると、

java sample.Loader /plugins

java sample.Loader ../plugins

で、plugins以下のファイルリストを表示します。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません