Как прочитать файл из пути, содержащего два или более zip-файлов между ними?

Предположим, у меня есть путь:

/path/to/zipfile.zip/my/earfile.ear/plainfile

где zipfile.zip — zip-файл, а earfile.ear — файл уха. Наличие этих сжатых файлов является произвольным.

Я хочу иметь метод, который принимает такой путь в качестве параметра и возвращает входной поток или считыватель для «простого файла».

Я слышал, что это проще реализовать в Java 7, но я не знаю, как это сделать.

Заранее спасибо.


person Ziyan Li    schedule 29.09.2018    source источник
comment
Проверьте, помогает ли это Чтение zip-файла внутри zip-файла   -  person samabcde    schedule 29.09.2018


Ответы (1)


Я придумал способ решить эту проблему с ограниченным условием, заключающимся в том, что разрешено ровно два zip-файла.

public BufferedReader testNestedZipEntry() {
    try {
        // first zip file wrapped by ZipFile, which allows random access(just feed a path!) to find an entry
        ZipFile zipFile = new ZipFile("/path/to/zipfile.zip");
        // second zip file wrapped by ZipInputStream, which is sequential so you have to iterate over entries to find the one you need
        ZipEntry jarZipEntry = zipFile.getEntry("earfile.ear");
        ZipInputStream jarZipIn = new ZipInputStream(zipFile.getInputStream(jarZipEntry));
        ZipEntry curEntry = null;
        while( (curEntry=jarZipIn.getNextEntry()) != null){
            // getNextEntry() method "positions" the input stream to curEntry
            // this is the reason why we can achieve this without extracting the file out
            if(curEntry.getName().equals("plainfile")) {
                return new BufferedReader(new InputStreamReader(jarZipIn)); 
            }
        }
    }catch(Exception e) {
        e.printStackTrace();
    }
}

Совет для начинающих: Записи в zip-файле — это все файлы, к которым вы можете получить доступ во всем zip-файле, а не только те, которые находятся в корневом каталоге zip-файла.

person Ziyan Li    schedule 08.10.2018
comment
вдохновленный stackoverflow.com/questions /11287486/ - person Ziyan Li; 08.10.2018