web-dev-qa-db-ja.com

jarからjarの外部のリソースにアクセスします

Jarファイルからリソースにアクセスしようとしています。リソースは、jarと同じディレクトリにあります。

my-dir:
 tester.jar
 test.jpg

次のようなさまざまなことを試しましたが、入力ストリームがnullになるたびに:

[1]

String path = new File(".").getAbsolutePath();
InputStream inputStream = this.getClass().getResourceAsStream(path.replace("\\.", "\\") + "test.jpg");

[2]

File f = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
InputStream inputStream = this.getClass().getResourceAsStream(f.getParent() + "test.jpg");

ヒントを教えていただけますか?ありがとう。

10
mdp

アプリケーションの現在のフォルダーがjarのフォルダーであることが確実な場合は、InputStream f = new FileInputStream("test.jpg");を呼び出すだけです。

getResourceメソッドは、ファイルシステムではなく、クラスローダーを使用してデータをロードします。これがあなたのアプローチ(1)が失敗した理由です。

*.jarと画像ファイルを含むフォルダがクラスパスにある場合、デフォルトパッケージにあるかのように画像リソースを取得できます。

class.getClass().getResourceAsStream("/test.jpg");

注意:イメージはクラスローダーにロードされます。アプリケーションが実行されている限り、イメージはアンロードされず、再度ロードしてもメモリから提供されます。

Jarファイルを含むパスがクラスパスに指定されていない場合は、jarファイルパスを取得するためのアプローチが適切です。ただし、ストリームを開いて、URIを介してファイルに直接アクセスするだけです。

URL u = this.getClass().getProtectionDomain().getCodeSource().getLocation();
// u2 is the url derived from the codesource location
InputStream s = u2.openStream();
8
thst

このチュートリアル を使用して、jarファイル内の単一ファイルへのURLを作成します。

次に例を示します。

String jarPath = "/home/user/myJar.jar";
String urlStr = "jar:file://" + jarPath + "!/test.jpg";
InputStream is = null;
try {
    URL url = new URL(urlStr);
    is = url.openStream();
    Image image = ImageIO.read(is);
}
catch(Exception e) {
    e.printStackTrace();
}
finally {
    try {
        is.close();
    } catch(Exception IGNORE) {}
}
0
eighthrazz