2011-03-02 3 views
8

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

ответ

17

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

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

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

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

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

+0

Часть того, что мне нужно, это BufferedReader, которому требуется FileReader как imput. Как преобразовать InputStream в FileReader? – LRFLEW

+0

Вы просто играете соединить точки с документацией Java. Посмотрите на BufferedReader - в разделе See See есть FileReader и InputStreamReader. Перейдите в InputStreamReader и т. Д. –

+0

Да, я могу это сделать, но я просто посмотрел BufferedReader и нашел класс parter BufferInputStream, который я должен использовать: P. – LRFLEW

1

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

4

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

Например:

BufferedReader reader = new BufferedReader(new InputStreamReader(
    this.getClass().getResourceAsStream("foo.txt"))); 
4

Вы можете прочитать содержимое файла 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(); 
} 
0

Просто хотел бы добавить, что если мы хотим получить доступ к файлу внутри 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"); 
Смежные вопросы