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();
        }
    }
}

你可能感兴趣的:(java二十(文件的压缩和解压))