- PR -

Class.getResource(String)について

1
投稿者投稿内容
90125
常連さん
会議室デビュー日: 2003/10/17
投稿数: 23
投稿日時: 2004-12-19 18:15
こんにちは。
クラスファイルと相対的な位置にあるリソース名を取得するのに、
Class.getResource(String)を使っています。
これは、URLを返すものですが、パス名に空白が入っていたりするとその部分が
%20などとエスケープされてしまいます。
こうした文字列をそのまま使ってファイルをオープンしたりする方法を知りません。
そうするのに、URLを簡単に解析する自前のプログラムを使っています。
もっと良い方法はありませんか?
OSはWindows XP、Javaは、j2sdk1.4.2_04です。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-12-19 22:10
ClassLoaderの概念は、場所、物を問わずにストリームで対象データを取り出す、
ということですので、このクラスを用いファイルデータを取得する場合、getResource()
の代わりに getResourceAsStream()を使用された方がすっきりする気がします。
InputStream is = clazz.getResourceAsStream(filename);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-12-20 04:09
再度、読み返してみると質問の回答になってませんでしたね。。。済みません。

引用:

クラスファイルと相対的な位置にあるリソース名を取得するのに、
Class.getResource(String)を使っています。
これは、URLを返すものですが、パス名に空白が入っていたりするとその部分が
%20などとエスケープされてしまいます。



うーむ、私の環境ではURLのgetPath()の戻り値を標準出力に書き出した限り、
エスケープされてはいないようなのですが。。。

引用:

こうした文字列をそのまま使ってファイルをオープンしたりする方法を知りません。



もしエスケープを元に戻すだけなら、java.net.URLDecoder#decode()を用いれば
よいのではないかと思います。

私の環境では、
コード:

URL url = clazz.getResource(filename);
File file = new File(url.getPath());


で、ファイルインスタンスを取得できたのですがバージョンによって違うのかも。
ひとつ今回の件で気が付いた事は、java.net.URI(not URL)のコンストラクタ
のパス指定で、空白文字が含まれる場合は例外が投げられるという事でした。
少し調べてみたらJava2sdk 1.4以降からのようで、RFCに厳密に対応した為
のようですね。

独り言:結構影響の出る改変だと思うんですが、そこまでの必要性有ったのかな?
90125
常連さん
会議室デビュー日: 2003/10/17
投稿数: 23
投稿日時: 2004-12-20 14:13
引用:

もしエスケープを元に戻すだけなら、java.net.URLDecoder#decode()を用いれば
よいのではないかと思います。


ありがとうございます。事実上解決しました。
1

スキルアップ/キャリアアップ(JOB@IT)