解压ZIP格式压缩包

发布时间 2024-01-12 14:21:27作者: save_me
public void unZip(File zipFile, String dest) throws Exception {
        try {
            // 首先创建ZipFile指向磁盘上的.zip文件
            ZipFile zFile = new ZipFile(zipFile);
            String encoding = "UTF-8";
            zFile.setFileNameCharset(encoding);

            // 检查时候有乱码情况,如果有变为GBK格式
            List list = zFile.getFileHeaders();
            for (int i = 0; i < list.size(); i++) {
                FileHeader fileHeader = (FileHeader) list.get(i);
                String fileName = fileHeader.getFileName();
                if (isMessyCode(fileName)) {
                    encoding = "GBK";
                    break;
                }
            }
            // 需新建一个ZipFile对象,才能重新设置编码格式
            ZipFile zFile1 = new ZipFile(zipFile);
            zFile1.setFileNameCharset(encoding);

            // 验证.zip文件是否合法,包括文件是否存在、是否为zip文件、是否被损坏等
            if (!zFile1.isValidZipFile()) {
                throw new PeException("文件可能已经被损坏!请重新打包尝试!");
            }
            // 解压目录
            File destDir = new File(dest);
            if (destDir.isDirectory() && !destDir.exists()) {
                destDir.mkdir();
            }
            zFile1.extractAll(dest);
        } catch (ZipException e) {
            throw new Exception("解析压缩文件过程中出现错误!!");
        }
    }
private static boolean isMessyCode(String str) {
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            // 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
            // 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
            if ((int) c == 0xfffd) {
                // 存在乱码
                return true;
            }
        }
        return false;
}