Java解压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,一切正常。
希望对大家有所帮助!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java文件内容时,如果遇到汉字乱码问题,可以使用正确的字符编码来决。 在文件时,可以使用`ZipFile`类和`ZipEntry`类来遍历缩包中的每个文件,并通过`InputStream`读取文件内容。在读取内容之前,我们可以使用`ZipEntry`的`getEncoding`方法获取文件名的编码格式。如果编码格式不为null,则表示文件名使用了特定的编码格式,我们可以使用该编码格式来读取文件内容。 如果文件名的编码格式为null,那么默认使用UTF-8编码来读取文件内容。 例如,以下是使用Java文件内容并决汉字乱码问题的示例代码: ```java import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class UnzipExample { public static void main(String[] args) { try { String zipFilePath = "path/to/your/zipFile.zip"; ZipFile zipFile = new ZipFile(zipFilePath); Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); String fileName; if (entry.getEncoding() != null) { fileName = new String(entry.getName().getBytes(StandardCharsets.ISO_8859_1), entry.getEncoding()); } else { fileName = entry.getName(); } System.out.println(fileName); InputStream inputStream = zipFile.getInputStream(entry); // 读取文件内容... inputStream.close(); } zipFile.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 通过在代码中正确地处理文件名的编码格式,我们可以避免文件内容时出现汉字乱码的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值