トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Java:クラスパスのファイルのフルパスを取得

Last-modified: 2014-11-16 (日) 14:26:34 (3446d)
Top / Java:クラスパスのファイルのフルパスを取得

Java:クラスパスのファイルのフルパスを取得

クラスパスに格納しているファイルを、

  • XX.getClass().getResourceAsStream?("パス")

で取得したりしますが、このファイルの絶対パスが知りたい場合がありました。

こんな感じのメソッドで実現できます。

public static String getFullPath(String resourcePath){
	return new File("".getClass().getResource(resourcePath).getPath()).getAbsolutePath();
}

具体的には、クラスパスにシェルを格納しておいて、テストの前に実行したかったりしました。

この時に作成したサンプルメソッドです。

public void sample() {
	String result;
	String shFilePath = 
			new File(this.getClass()
					.getResource("/testdata/putdata.sh")
					.getPath())
			.getAbsolutePath();
	String cmd = "sh " + shFilePath;
	System.out.println(cmd);
	try {
		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd);

		final InputStream stdout = proc.getInputStream();
		final InputStream stderr = proc.getErrorStream();

		// 標準出力を受けて出力するスレッドを作成
		Thread outth = new Thread(new Runnable() {
			public void run() {
				try {
					BufferedReader br = new BufferedReader(
							new InputStreamReader(stdout));
					String line;
					while ((line = br.readLine()) != null) {
						System.out.println(line);
					}
					br.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

		// 標準エラー出力を受けてエラー出力するスレッドを作成
		Thread errth = new Thread(new Runnable() {
			public void run() {
				try {
					BufferedReader br = new BufferedReader(
							new InputStreamReader(stderr));
					String line;
					while ((line = br.readLine()) != null) {
						System.err.println(line);
					}
					br.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

		// スレッドスタート
		outth.start();
		errth.start();
		// 外部プロセス終了待ち
		proc.waitFor();
		// スレッド終了待ち
		outth.join();
		errth.join();
		// ストリームを閉じる
		stdout.close();
		stderr.close();
		// BufferedReader br = new BufferedReader(isr);
		// while ((result = br.readLine()) != null) {
		// System.out.println(result);
		// }
	} catch (IOException ex) {
		ex.printStackTrace();
	} catch (InterruptedException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	}
}

ちなみに、このサンプルでは、外部実行したコマンドの標準出力/エラー出力を出力するためにスレッドを使用しています。