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");
ヒントを教えていただけますか?ありがとう。
アプリケーションの現在のフォルダーが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();
このチュートリアル を使用して、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) {}
}