java二十(文件的壓縮和解壓)

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class zip壓縮與解壓 {

    public static void main(String[] args) {
        // compression("C:\\Users\\puban\\Desktop\\b.zip", new File("C:\\Users\\puban\\Desktop\\設計稿"));
        deCompression("C:\\\\Users\\\\puban\\\\Desktop\\\\b.zip", "C:\\Users\\puban\\Desktop\\java");
    }

    // 文件夾和文件壓縮

    /**
     * @param zipFilePath 壓縮后的文件路徑;
     * @param targetFile  需要壓縮的文件
     */
    public static void compression(String zipFilePath, File targetFile) {
        try {

            if (zipFilePath == null || targetFile == null) return;

            // zip輸出流:寫入文件
            ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFilePath));
            // 設置壓縮等級
            zipOutputStream.setLevel(1);
            // 加入緩存
            BufferedOutputStream bos = new BufferedOutputStream(zipOutputStream); // 加入到緩存

            zip(zipOutputStream, targetFile, targetFile.getName(), bos);

            // 關閉流
            bos.close();
            zipOutputStream.close();

            System.out.println("壓縮成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param zipOutputStream zip輸出流
     * @param targetFile      壓縮的文件
     * @param name            壓縮的名字
     * @param bos             緩存
     */

    private static void zip(ZipOutputStream zipOutputStream, File targetFile, String name, BufferedOutputStream bos) throws IOException {
        // 如果是文件夾
        if (targetFile.isDirectory()) {
            File[] files = targetFile.listFiles(); // 獲取所有文件
            // 如果是空文件夾,也要壓縮
            if (files.length == 0) {
                zipOutputStream.putNextEntry(new ZipEntry(name + "/"));
            }
            System.out.println(name);

            for (File f : files) {
                // 遞歸處理
                // name : 文件夾名字+f.separator(分割符號)+文件名稱
                zip(zipOutputStream, f, name + f.separator + f.getName(), bos);
            }
        } else {
            // 如果是文件 寫入zip流
            zipOutputStream.putNextEntry(new ZipEntry(name));
            InputStream in = new FileInputStream(targetFile);
            BufferedInputStream bis = new BufferedInputStream(in);

            int len = -1;
            byte[] bytes = new byte[1024];

            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
                bos.flush();   // 每次寫入完成之后都要刷新一下緩存,不然下一次生成文件就會文件錯誤
            }

            bis.close();
        }
    }


    // 文件解壓

    /**
     * @param zipFilePath   要壓縮文件路徑
     * @param newPathParent 放在哪個路徑
     */
    public static void deCompression(String zipFilePath, String newPathParent) {
        try {
            // 輸出流
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath));
            File file = null;
            ZipEntry zipEntry = null;

            while ((zipEntry = zipInputStream.getNextEntry()) != null && !zipEntry.isDirectory()) {
                // 這里包括文件文件夾的創建
                file = new File(newPathParent, zipEntry.getName());

                // 如果這個不是文件,就創建上級文件夾
                if (!file.exists()) {
                    new File(file.getParent()).mkdir();
                }
                // 寫入文件
                OutputStream out = new FileOutputStream(file);
                BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out);

                int len = -1;
                byte[] bytes = new byte[1024];
                while ((len = zipInputStream.read(bytes)) != -1) {
                    bufferedOutputStream.write(bytes, 0, len);
                    bufferedOutputStream.flush(); // 刷新緩存
                }
                bufferedOutputStream.close();

            }
            System.out.println("解壓成功");

            zipInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容