Java解压zip文件(支持中文字符文件)

本文通过实战演示了解压ZIP文件的过程,并解决了压缩包内含中文字符导致的乱码问题。

昨天接到了一个解压zip文件的任务,所以今天在做任务之前,便写demo试了一下,
部分思路参考自:这里
贴上代码:

public void Decompressing2() throws IOException {
        String path = "E:\\zipTest";
        ZipEntry zipEntry = null;
        try (
                // ZipInputStream读取压缩文件
                ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "\\toefl.zip"),Charset.forName("GBK"));
                // 写入到缓冲流中
                BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);){
            File fileOut = null;
            // 读取压缩文件中的一个文件
            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                // 若当前zipEntry是一个文件夹
                if (zipEntry.isDirectory()) {
                    fileOut = new File(path + "//" +zipEntry.getName());
                    // 在指定路径下创建文件夹
                    if (!fileOut.exists()) {
                        fileOut.mkdirs();                       
                    }
                //若是文件
                } else {
                    // 原文件名与指定路径创建File对象(解压后文件的对象)
                    fileOut = new File(path, zipEntry.getName());
                    try(
                            FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
                            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);){
                        //将文件写入到指定file中
                        int b = 0;
                        while ((b = bufferedInputStream.read()) != -1) {
                            bufferedOutputStream.write(b);
                    }
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }

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

在测试中发现,若压缩包中包含汉字会跑出异常!
异常如下:

查看源码发现:ZipInputStream对象有两个构造方法
这里写图片描述

发现其默认构造方法的CharSet对utf8格式:StandardCharsets.UTF_8

所以用ISO-8859-1试了一下
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "/tpo40.zip"),StandardCharsets.ISO_8859_1);
结果如下:
这里写图片描述

打开解压后的文件:
这里写图片描述

解压后文件很正常(没有中文字符),但是文件夹名字乱码

后打算用GBK试一下:

查看StandardCharsets源码:
这里写图片描述
并没有GBK这个常量,但是 其成员的声明方法是:Charset.forName(“xxxx”)的方式。
所以采用如下方式创建ZipInputStream对象:

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "\\toefl.zip"),Charset.forName("GBK"));

解压后OK,一切正常。
希望对大家有所帮助!!

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值