сегодня снова использовал класс для распаковки и решил расставить комментарии и выложить код в теме. есть подозрения, что он кому-то может пригодиться. может, это всё и просто, и очевидно, как многим кажется, но лично я - тормоз, помнится, въехал только с третьей попытки. надеюсь комментарии помогут кому-нибудь разобраться в принципах использования утилиты zip:
...
import java.io.*;
import java.util.zip.*;
public class Unzip {
// filename - имя файла архива
// unzipPath - путь к папке, в которую будет распакованы файлы и папки из архива filename
// метод поддерживает структуру папок при распаковке
// (вхождение в архив - запакованные в архив файл или папка)
public static void unzip(String filename, String unzipPath) {
try {
// буфер для чтения из архива
byte[] buf = new byte[1024];
// поток архива
ZipInputStream zipinputstream = null;
// вхождения в архив
ZipEntry zipentry;
// создаем поток архива, параметр - свежесозданный поток файла архива
zipinputstream = new ZipInputStream(
new FileInputStream(filename));
// получаем очередное вхождение в архив
zipentry = zipinputstream.getNextEntry();
// перебираем все вхождения в архив
// пока все вхождения в архив не кончатся
while (zipentry != null) {
// получаем имя вхождения (запакованного файла или папки)
String entryName = zipentry.getName();
// для отладки
System.out.println("entryname " + entryName);
// количество фактически прочитанных байтов
int n;
// создаем поток для чтения распакованного файла/папки
FileOutputStream fileoutputstream;
// создаем собственно файл
File newFile = new File(entryName);
// если очередное вхождение - папка, то пропускаем текущую итерацию цикла
String directory = newFile.getParent();
if(directory == null) {
if(newFile.isDirectory())
break;
}
// если вхождение - файл, то создаем выходной поток для записи распакованного файла
// с учетом указанного пути для распаковки
fileoutputstream = new FileOutputStream(unzipPath + entryName);
// переписываем весь файл из архива в созданный поток
while ((n = zipinputstream.read(buf, 0, 1024)) > -1)
fileoutputstream.write(buf, 0, n);
// закрываем поток
fileoutputstream.close();
// закрываем вхождение
zipinputstream.closeEntry();
// получаем следующее вхождение
zipentry = zipinputstream.getNextEntry();
}
// закрываем поток архива
zipinputstream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}