Как прочитать файл war / jar, который не имеет манифеста - PullRequest
1 голос
/ 10 мая 2011

У меня есть файл war, который не содержит манифеста, даже папки META-INF.Теперь моя проблема в том, что я написал код, который работал нормально с обычными военными файлами, содержащими манифесты.Теперь мне нужно прочитать файл войны, который не содержит манифеста.

Когда я проверяю

while ((ze = zis.getNextEntry()) != null)

Это условие просто пропускается.Есть ли API, который обрабатывает его как обычный zip-файл, или есть обходной путь.

Я пробовал с JarEntry, а также ZipEntry.Вот небольшой фрагмент, который должен быть пояснительным.

try {
            FileInputStream fis = new FileInputStream(applicationPack);
            ZipArchiveInputStream zis = new ZipArchiveInputStream(fis);
            ArchiveEntry ze = null;
            File applicationPackConfiguration;           
            while ((ze = zis.getNextEntry()) != null) {
            // do someting
}

Что можно сделать?

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Вы можете просто перечислить содержимое с помощью ZipFile class:

try {
  // Open the ZIP file
  ZipFile zf = new ZipFile("filename.zip");

  // Enumerate each entry
  for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
    // Get the entry name
    String zipEntryName = ((ZipEntry)entries.nextElement()).getName();
  }
} catch (IOException e) {
}

Пример взят из здесь .Другой пример извлечения файла из zip .

Обновление:

Код, приведенный выше, действительно имеет проблемы с zip-файлами, которые содержат только каталог в верхней частиэлемент

Этот код работает (проверено):

    try {
        // Open the ZIP file
        FileInputStream fis = new FileInputStream(new File("/your.war"));
        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));

        ZipEntry entry = null;

        while ((entry = zis.getNextEntry()) != null)
            // Get the entry name
            System.out.println(entry.getName());
    } catch (IOException e) {
    }
0 голосов
/ 10 мая 2011

Вы можете использовать классы из пакета java.util.zip .Просто замените ZipArchiveInputStream на ZipInputStream и ArchiveEntry на ZipEntry:

FileInputStream fis = new FileInputStream(new File("/path/to/your.war"));
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
   System.out.println(ze.getName());
}
...