ZipInputStream是一種FilterInputStream,它可以直接讀取zip包的內容:

讀取zip包
ZipInputStream的基本用法
我們要創建一個ZipInputStream,通常是傳入一個FileInputStream作為數據源,然后,循環調用getNextEntry(),直到返回null,表示zip流結束。一個ZipEntry表示一個壓縮文件或目錄,如果是壓縮文件,我們就用read()方法不斷讀取,直到返回-1:
try (ZipInputStream zip = new ZipInputStream(new FileInputStream(...))) {
ZipEntry entry = null;
while ((entry = zip.getNextEntry()) != null) {
String name = entry.getName();
if (!entry.isDirectory()) {
int n;
while ((n = zip.read()) != -1) {
...
}
}
}
}
寫入zip包
ZipOutputStream是一種FilterOutputStream,它可以直接寫入內容到zip包。我們要先創建一個ZipOutputStream,通常是包裝一個FileOutputStream,然后,每寫入一個文件前,先調用putNextEntry(),然后用write()寫入byte[]數據,寫入完畢后調用closeEntry()結束這個文件的打包。
try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(...))) {
File[] files = ...
for (File file : files) {
zip.putNextEntry(new ZipEntry(file.getName()));
zip.write(getFileDataAsBytes(file));
zip.closeEntry();
}
}
上面的代碼沒有考慮文件的目錄結構。如果要實現目錄層次結構,new ZipEntry(name)傳入的name要用相對路徑。
小結
ZipInputStream可以讀取zip格式的流,ZipOutputStream可以把多份數據寫入zip包;
配合FileInputStream和FileOutputStream就可以讀寫zip文件。
