Откройте файл архива, который находится в другом файле архива, используя Java - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть файл с именем "file.ear".Этот файл содержит несколько файлов, в том числе файл «war» с именем «file.war» (который также является архивом).Я намерен открыть текстовый файл, который находится в «file.war».В данный момент мой вопрос заключается в том, какой из способов «создать файл ZipFile» из этого файла «file.war»

был создан.Когда запись «file.war», я пытался создать еще один ZipFile

ZipFile earFile = new ZipFile("file.ear");
Enumeration(? extends ZipEntry) earEntries = earFile.entries();

while (earEntries.hasMoreElements()) {
    ZipEntry earEntry = earEntries.nextElement();
    if (earEntry.toString().equals("file.war")) {
        // in this line I want to get a ZipFile from the file "file.war"
        ZipFile warFile = new ZipFile(earEntry.toString());
    }
}

Я ожидаю получить экземпляр ZipFile из «file.war», и отмеченная строка выбрасывает исключение FileNotFoundException.

1 Ответ

1 голос
/ 02 апреля 2019

ZipFile только для ... файлов. A ZipEntry находится только в памяти, а не на жестком диске.

Вам лучше использовать ZipInputStream:

  1. вы оберните FileInputStream в ZipInputStream
  2. вы получаете доступ к .war записи InputStream
  3. вы оборачиваете .war по очереди InputStream в ZipInputStream
  4. вы можете зацепиться за текстовый файл, прочитав его InputStream
  5. делай что хочешь с текстом InputStream!
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Snippet {

    public static void main(String[] args) throws IOException {

        InputStream w = getInputStreamForEntry(new FileInputStream("file.ear"), "file.war");
        InputStream t = getInputStreamForEntry(w, "prova.txt");

        try (Scanner s = new Scanner(t);) {
            s.useDelimiter("\\Z+");
            if (s.hasNext()) {
                System.out.println(s.next());
            }
        }

    }

    protected static InputStream getInputStreamForEntry(InputStream in, String entry)
            throws FileNotFoundException, IOException {
        ZipInputStream zis = new ZipInputStream(in);

        ZipEntry zipEntry = zis.getNextEntry();

        while (zipEntry != null) {
            if (zipEntry.toString().equals(entry)) {
                // in this line I want to get a ZipFile from the file "file.war"
                return zis;
            }
            zipEntry = zis.getNextEntry();
        }
        throw new IllegalStateException("No entry '" + entry + "' found in zip");
    }

}

НТН!

...