2013-08-16 3 views
2

Извините за запутанный заголовок. В основном у меня есть ZipFile, в котором есть несколько файлов .txt, но также есть одна папка. Код, который я показываю ниже, находит эту папку в записях zip. Я очень хорошо это сделал. Проблема в том, что как только я нахожу папку, это ZipEntry. Который не имеет полезных методов для получения записей внутри этой папки. Папка, которую я нахожу, содержит больше .txt-файлов, которые я хочу обработать (это главная цель).Как получить доступ к файлам внутри папки, находящейся внутри ZipEntry

zipFile = new ZipFile(zipName); 
Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
while(entries.hasMoreElements()){ 
    ZipEntry current = entries.nextElement(); 
    if(current.getName().equals(folderName)) { 
     assertTrue(current.isDirectory()); 
     //Here is where I want to get the files in the folder 
    } 
} 

ответ

3

ZipEntry имеет метод isDirectory() который

Возвращает истину, если это элемент каталога. Запись в каталоге определяется как имя, имя которого заканчивается символом '/'.

Что вы хотите сделать, это перебрать все записи (как вы делаете) и получить InputStream для тех, которые находятся внутри каталога, то есть. которые имеют путь относительно каталога.

Скажите folderName имеет значение "/zip/myzip/directory", тогда файл внутри этого каталога будет иметь имя "/zip/myzip/directory/myfile.txt". Вы можете использовать Java NIO Path API, чтобы помочь вам

Path directory = Paths.get("/zip/myzip/directory"); // you get this directory path from the ZipEntry 
Path file = Paths.get(current.getName()); 
if (file.startsWith(directory)) { 
    // do your thing 
} 

Вы можете получить InputStream как

zipFile.getInputStream(current); 

Примечание что пути внутри Zip файл будет относительно корня местоположения Zip , Если почтовый находится

C:/Users/You/Desktop/myzip.zip 

папку, непосредственно внутри почтового индекса с шоу путь, как

directory/ 
-1

Нечто подобное может помочь вам

final ZipFile zf = new ZipFile(filename); 
for (final Enumeration<? extends ZipEntry> e = zf.entries(); e.hasMoreElements();) { 
final ZipEntry ze = e.nextElement(); 
if (!ze.isDirectory()) { 
    final String name = ze.getName(); 
    //..... 
    } 
} 

Наслаждайтесь ;-)

-1

На самом деле есть более простой способ сделать это. Если вы знаете, что текущая запись является каталогом, то при использовании ZipInputStream следующий элемент будет автоматически находиться в этом каталоге. Например, предположим, что ваша структура каталогов заключается в следующем:

Dir1/A.txt Dir1/B.txt Dir2/C.txt D.txt 

Тогда доступ ко всем три выше, вы просто должны идти об этом так:

ZipInputStream Zis = new ZipInputStream(in); 
ZipEntry entry = Zis.getNextEntry(); 
while (entry != null) { 
    if(!entry.isDirectory) 
     //do something with entry 
    //else continue 
    entry = Zis.getNextEntry(); 
} 

Это будет перебирать все файлы (в порядок, в котором они перечислены) без необходимости явно проверять, являются ли они каталогами, поскольку вы не делаете с ними ничего другого.

Смежные вопросы