powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
12 сообщений из 12, страница 1 из 1
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38650679
A+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A+
Гость
На самом деле:
Есть EAR'ка, внутри которой лежит JAR'ник, внутри которого есть файл, содержимое которого надо извлечь. Ну или просто узнать список классов, что лежат в JAR'нике.

Пока нашел только одно решение:
1. JarFile jarFile = new JarFile(earLocation); и через JarFile#entries "доходим" до JAR'ки (JAR'ок может быть много и их имена заранее неизвестны);
2. jarFile.getInputStream(entry) - и вот этот поток "переливается" во временный файл;
3. И опять же через JarFile обрабатываем файл из п.2.: ищем нужный Entry и вытягиваем через InputStream его содержимое;
4. Повторяем 1-3 для всех JAR'файлов из EAR'ки.

Решение не нравится тем, что приходится во временный файл что-то записывать - кажется лишним этапом (лишние риски + время: вполне возможно, что в этом JAR'нике нет нужного файла). Может, есть другое решение?
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38650684
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А делать это в рантайме зачем?
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38650687
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде же на вход http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipInputStream.html можно просто поток подать? Т.ч. временный файл вроде не обязателен.
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38650839
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevВроде же на вход http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipInputStream.html можно просто поток подать? Т.ч. временный файл вроде не обязателен.
Точно не обязателен.

Пример работы с zip архивом (правда без вложенного zip'а)
sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1089609&msg=15921883
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38651723
A+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A+
Гость
За ZipInputStream/JarInputStream спасибо.
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38651725
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A+За ZipInputStream/JarInputStream спасибо.
Class/ClassLoader.getResourceAsStream() вообще не вариант?
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38652184
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczA+За ZipInputStream/JarInputStream спасибо.
Class/ClassLoader.getResourceAsStream() вообще не вариант?

Наверняка здесь было уже, что Class/ClassLoader.getResourceAsStream() ищет запрашиваемый ресурс по очереди во всех jar'чиках из classpath, и найдя его в первом попавшемся, радостно его возвращает.
Т.е. если искать Class/ClassLoader.getResourceAsStream("’META-INF/MANFEST.MF"), то результат сильно зависит от того, как перечислены jar'чики в classpath
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38652191
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeНаверняка здесь было уже, что Class/ClassLoader.getResourceAsStream() ищет запрашиваемый ресурс по очереди во всех jar'чиках из classpath, и найдя его в первом попавшемся, радостно его возвращает.
Т.е. если искать Class/ClassLoader.getResourceAsStream("’META-INF/MANFEST.MF"), то результат сильно зависит от того, как перечислены jar'чики в classpath
Для манифеста в java.util.jar есть собственный API. Интересно, пофиксили ли багу с тем что манифест должен быть первой ZipEntity?
Так как автор о манифесте не упоминает, логично предположить, что вопрос не в нем.
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38652335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... кстати возникла мысль об дисковой оптимизации загрузки приложения из jar/war/ear.
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38652479
A+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A+
Гость
Blazkowicz,
Class/ClassLoader.getResourceAsStream() тоже придется использовать.

По-подробнее задача звучит так:
1. Есть некая коллекция JAR'ников (с названиями, соответствующими определенному шаблону - уже просто для ускорения поиска);
1.1. Каждый такой JAR'ник содержит до 1 (одной) реализации одного из 3х интерфейсов;
1.2. JAR'ник, содержащий такой класс, имеет в /META-INF несколько ресурсных файлов (не .properties) с неким [локализованным] описанием данной реализации интерфейса - шаблон названий таких файлов известен (но не известны локали, для которых они существуют - но их разумное количество ~ 5-6);
2. Надо: по запросу (с указанием локали) вернуть информацию об этих классах: полное название класса + локализованное описание (из ресурсного файла) + какой из 3х интерфейсов он (класс) реализует;
3. Решение должно работать на JBoss 4.2.3 GA и JBoss 7.1.1; Java 1.6+
4. [часть] JAR'ников может быть в EAR'ке (а могут лежать и в "библиотечной" папке - просто россыпью).

Пока планирую решать проблему таким образом:
1. По значению свойства "jboss.server.base.home" находим папку, в которой будем вести поиск;
2. Найдя JAR'ник с "шаблонным" названием, заглядываем в него:
2.1. Название класса извлекаем через JarEntry#getName();
2.2. локализованные файлы-"дескрипторы" читаем через Class/ClassLoader.getResourceAsStream() (класс берем тот, что получили в предыдущем пункте) - предварительно через JarEntry#getName() узнав как эти файлы называются;
2.3. Какой интерфейс реализован определяем через Class#isAssignableFrom;

Не нравится: сам старт: "jboss.server.base.home" содержит кучу левых каталогов. Завязаться на ${jboss.server.base.home}/deploy + ${jboss.server.base.home}/lib не могу: в JBoss 7.1.1 папка деплоя и "библиотечная" папка называются по-другому.

"разгребать" EAR'ки пока планирую так: JarFile -> JarInputStream -> JarEntry + Class/ClassLoader.getResourceAsStream()
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38653744
A+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A+
Гость
J.SergeНаверняка здесь было уже, что Class/ClassLoader.getResourceAsStream() ищет запрашиваемый ресурс по очереди во всех jar'чиках из classpath, и найдя его в первом попавшемся, радостно его возвращает.

Именно так он себя и ведет - если JAR'ка лежит в EAR/lib; в противном случае Class#getResourceAsStream() работает корректно. Проблема в том, что мои JAR'ки как раз в EAR/lib и будут лежать скорей всего (в них нету ничего "энтерпрайзного": MDB, session beans, ...) - так что решил эти файлы "дескрипторов" читать через JarInputStream#read: "дошли" до нужного JarEntry и считали.
...
Рейтинг: 0 / 0
Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
    #38654307
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A+,

посмотри еще getClass().getProtectionDomain().getCodeSource().getLocation(),
чтобы не перебирать jar'чики один за другим
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прочитать файл из ZIP'ки, что внутри ZIP'ки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]