Как получить файл из банки? - PullRequest
2 голосов
/ 18 октября 2011

Мне нужен файл filename.txt, который находится внутри файла JAR.Как я могу прочитать содержимое текстового файла с помощью кода?Есть ли библиотеки для работы с файлами * .jar?

Ответы [ 7 ]

3 голосов
/ 18 октября 2011
public class Test {
    public static void main(String[] args) {
        InputStream stream = Test.class.getResourceAsStream("/test.txt");
        Scanner s = new Scanner(stream);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
    }
}

Баночка должна находиться на пути к классу приложения.

Этот код будет искать файл test.txt в корне всех jar-файлов.

Если вам нужно указать банку, которой нет в пути к классам, другие предложения могут оказаться более полезными.

3 голосов
/ 18 октября 2011

Если банка находится в пути к классам, вы можете получить доступ к файлу в нем с помощью getClass().getClassLoader().getResourceAsStream(...). Если файл jar отсутствует в пути к классам, проверьте java.util.jar.JarFile.

2 голосов
/ 18 октября 2011

Есть ли библиотеки для работы с * .jar файлами?

Да, есть java.util.zip (jar-файлы - это, по сути, zip-файлы, подробнее здесь ), в самом JDK (сторонняя библиотека не требуется).

См. Также эту статью на веб-сайте Oracle, где приведены примеры и тому подобное. Вот код из их первого примера, распаковывающий все файлы из архива (не мой код, и, конечно, как и в большинстве примеров, он имеет недостаточную проверку ошибок и т. Д.):

import java.io.*;
import java.util.zip.*;

public class UnZip {
   final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedOutputStream dest = null;
         FileInputStream fis = new FileInputStream(argv[0]);
         ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;
         while((entry = zis.getNextEntry()) != null) {
            System.out.println("Extracting: " +entry);
            int count;
            byte data[] = new byte[BUFFER];
            // write the files to the disk
            FileOutputStream fos = new FileOutputStream(entry.getName());
            dest = new BufferedOutputStream(fos, BUFFER);
            while ((count = zis.read(data, 0, BUFFER)) != -1) {
               dest.write(data, 0, count);
            }
            dest.flush();
            dest.close();
         }
         zis.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}
1 голос
/ 10 декабря 2013

Должна сработать следующая команда:

jar xf yyy.jar files/xxx.txt

Убедитесь, что используется правильный JDK для банки для ее упаковки, используя

jar uf yyy.jar files/xxx.txt

1 голос
/ 18 октября 2011

Вам не нужна отдельная библиотека. Пакеты zip по умолчанию работают нормально.

private String getFile(File jar, String requestedFile) throws IOException{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); //change ouptut stream as required
    ZipInputStream in = null;
    try {
        in = new ZipInputStream(new FileInputStream(jar));
        ZipEntry entry;
        while((entry  = in.getNextEntry())!=null){
            if (entry.getName().equals(requestedFile)){

                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
            }
        }
    } finally {
        if (in!=null){
            in.close();
        }
        out.close();

    }
    return new String(out.toByteArray());
}
0 голосов
/ 18 октября 2011

Сначала проверьте, где в yyy.jar находится ваш xxx.txt, расположенный

jar tf yyy.jar

Пример вывода

META-INF/MANIFEST.MF
images/pic.gif
files/abc.txt
files/xxx.txt

Теперь, когда вы знаете путь к xxx.txt,

Извлечь его с помощью

jar xf yyy.jar files/xxx.txt
0 голосов
/ 18 октября 2011

Откройте его с помощью любых служебных программ zip. .jar - это просто файл .zip.

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