Доступ к ресурсу вне банки из банки

Я пытаюсь получить доступ к ресурсу из файла jar. Ресурс находится в той же директории, что и jar.

my-dir:
 tester.jar
 test.jpg

Я пробовал разные вещи, включая следующие, но каждый раз, когда входной поток равен нулю:

[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");

Можете ли вы дать мне несколько советов? Спасибо.


person mdp    schedule 22.08.2016    source источник
comment
getResourceAsStream получает ресурс из банки. docs.oracle.com/javase/7/docs/ API/java/io/FileInputStream.html   -  person tkausl    schedule 22.08.2016
comment
getResourceXXX загрузит ресурсы из пути к классам, вам нужно открыть jpg в виде файла или добавить my-dir в путь к классам.   -  person folkol    schedule 22.08.2016
comment
Пробовали ли вы разделить код, чтобы быть уверенным, что вы получили правильный путь к файлу .jpg?   -  person Lars Kristensen    schedule 22.08.2016
comment
@LarsKristensen - я напечатал путь к .jpg, и он кажется правильным с опцией [1]   -  person mdp    schedule 22.08.2016
comment
@tkausl - Означает ли это, что я должен использовать другой подход для получения ресурса?   -  person mdp    schedule 22.08.2016
comment
это может помочь.   -  person Andrew S    schedule 22.08.2016


Ответы (2)


Если вы уверены, что текущая папка вашего приложения является папкой 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();
person thst    schedule 22.08.2016

Используйте это руководство, чтобы помочь вам создать URL-адрес одного файла в файле jar. .

Вот пример:

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) {}
}
person eighthrazz    schedule 22.08.2016
comment
OP ясно говорит, что jar и jpg находятся в одной папке. Он не спрашивает, как получить доступ к ресурсу ВНУТРИ jar. - person Boss Man; 05.08.2019