Доступ к файлу в jar-файле? - PullRequest
11 голосов
/ 02 марта 2011

Мне нужно иметь доступ к файлу, который хранится в скомпилированном jar-файле.Я понял, как добавить файл в проект, но как бы я сослался на него в коде?Как я могу скопировать файл из файла JAR в папку на жестком диске пользователя?Я знаю, что существуют десятки способов доступа к файлу (FileInputStream, FileReader и т. Д.), Но я не знаю, как заглянуть внутрь себя.

Ответы [ 5 ]

22 голосов
/ 02 марта 2011

Вы можете использовать что-то вроде этого:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileFromJarFile);

Если бы foo.txt был в корне вашего JAR-файла, вы бы использовали:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.txt");

предполагает, что класс находится в том же файле JAR, что и ресурс, я считаю.

4 голосов
/ 02 марта 2011

Вы можете прочитать содержимое файла JAR, используя класс JarFile .

Вот пример того, как вы можете получить конкретный файл из файла JAR и извлечь его:

JarFile jar = new JarFile("foo.jar");
String file = "file.txt";
JarEntry entry = jar.getEntry(file);
InputStream input = jar.getInputStream(entry);
OutputStream output = new FileOutputStream(file);
try {
    byte[] buffer = new byte[input.available()];
    for (int i = 0; i != -1; i = input.read(buffer)) {
        output.write(buffer, 0, i);
    }
} finally {
    jar.close();
    input.close();
    output.close();
}
4 голосов
/ 02 марта 2011

Вы можете использовать getResource () , чтобы получить URL-адрес для файла на пути к классам, или getResourceAsStream () , чтобы получить InputStream вместо этого.

Например,:

BufferedReader reader = new BufferedReader(new InputStreamReader(
    this.getClass().getResourceAsStream("foo.txt")));
1 голос
/ 22 февраля 2015

Просто хотел добавить, что если мы хотим получить доступ к файлу внутри Jar, который расположен по следующему пути:

Windows:  
c:\your-jar-file.jar\dir1\dir2\dir3\foo.txt

Linux: 
/home/your-jar-file.jar/dir1/dir2/dir3/foo.txt

Нужно будет использовать следующий код (обратите внимание, что есть NO"/" (косая черта) в начале пути):

InputStream is = this.getClass().getClassLoader().getResourceAsStream("dir1/dir2/dir3/foo.txt");
0 голосов
/ 02 марта 2011

Посмотрите на класс JarFile.Все, что вам нужно, чтобы получить InputStream определенной записи в файле JAR, есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...