Java IO: 讀寫zip文件


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

image-20200821092853941

讀取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包;

配合FileInputStreamFileOutputStream就可以讀寫zip文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM