Java实现ZIP算法压缩和解压操作

        ZIP是一种流行的文件压缩格式,它可以将多个文件打包成一个文件,以减小文件大小并方便传输。ZIP文件可以在大多数操作系统和软件中解压缩,例如Windows、Mac和Linux系统上的许多文件管理器和解压缩工具。ZIP压缩可以使用许多不同的压缩算法,包括DEFLATE、LZMA和BZIP2。ZIP文件还支持文件加密和分卷压缩,可以方便地将大文件分成多个部分。

        下面我们来一起实现一下ZIP压缩算法:

package com.xxx.utils;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * @author tobiasy
 * @date 2021/2/6
 */
public class ZipUtils {
    public static void main(String[] args) {
        File file = new File("F:\\test\\xxx");
        zip(file);

    }

    public static void unzip(File file) {
        try {
            ZipFile zipFile = new ZipFile(file, Charset.forName("gbk"));
            String targetContent = toCurrContent(file);
            FileCreator.createFile(targetContent, File::mkdir);
            Enumeration<? extends ZipEntry> entries;
            for (entries = zipFile.entries(); entries.hasMoreElements(); ) {
                ZipEntry zipEntry = entries.nextElement();
                File targetFile = new File(targetContent + "/" + zipEntry.getName());
                if (zipEntry.isDirectory()) {
                    FileCreator.createFile(targetContent, File::mkdir);
                } else {
                    FileCreator.newDirsFile(targetFile);
                    FileOutputStream os = new FileOutputStream(targetFile);
                    InputStream is = zipFile.getInputStream(zipEntry);
                    FileUtils.write(is, os);
                }

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

    public static void zip(File dir) {
        try {
            String zipPath = toCurrZip(dir);
            File targetFile = new File(zipPath);
            FileOutputStream os = new FileOutputStream(targetFile);
            ZipOutputStream zos = new ZipOutputStream(os);
            if (dir.isDirectory()) {
                addZipDir(dir, dir, zos);
            }
            zos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void addZipDir(File dir, File subFile, ZipOutputStream zos) {
        try {
            File[] files = subFile.listFiles();
            if (files == null) {
                return;
            }
            for (File file : files) {
                if (file.isFile()) {
                    String path = file.getPath();
                    String entryName = getZipEntryName(dir.getPath(), path);
                    System.out.println(entryName);
                    zos.putNextEntry(new ZipEntry(entryName));
                    FileInputStream is = new FileInputStream(file);
                    FileUtils.write(is, zos);
                    zos.closeEntry();
                    is.close();
                } else {
                    addZipDir(dir, file, zos);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String getZipEntryName(String basePath, String subFilePath) {
        String entryName = subFilePath.replace(basePath, "");
        String[] ss = new String[]{"/", "\\"};
        for (String s : ss) {
            if (entryName.startsWith(s)) {
                return entryName.substring(s.length());
            }
        }
        return entryName;
    }

    private static String toCurrContent(File file) {
        return file.getPath().replace(FileUtils.getFileSuffix(file.getPath()), "");
    }

    private static String toCurrZip(File dir) {
        return dir.getPath() + ".zip";
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37649480/article/details/134931060