Java操作Zip压缩文件遇到的编码问题

1、遇到的问题:在for循环操作zip文件(文件名包含中文)的过程中,报错如下:

Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED
at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:297)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:121)
at com.forestfood.FileUntils.done(FileUntils.java:224)
at com.forestfood.FileUntils.getActionZipFiles(FileUntils.java:196)
at com.forestfood.FileUntils.main(FileUntils.java:24)

2、查找原因:追查报错代码行至  ZipCoder.java:58

final class ZipCoder {
    String toString(byte[] ba, int length) {
        CharsetDecoder cd = decoder().reset();
        int len = (int)(length * cd.maxCharsPerByte());
        char[] ca = new char[len];
        if (len == 0)
            return new String(ca);
        // UTF-8 only for now. Other ArrayDeocder only handles
        // CodingErrorAction.REPLACE mode. ZipCoder uses
        // REPORT mode.
        if (isUTF8 && cd instanceof ArrayDecoder) {
            int clen = ((ArrayDecoder)cd).decode(ba, 0, length, ca);
            if (clen == -1)    // malformed
                throw new IllegalArgumentException("MALFORMED");
            return new String(ca, 0, clen);
        }

可以发现,如果不指定编码的时候,默认是UTF-8,在解码的时候就会发生错误。

3、解决方法:在创建zip的时候,指定编码

FileInputStream fileInputStream = new FileInputStream(zipPath);
Charset gbk = Charset.forName("gbk");
ZipInputStream zin = new ZipInputStream(fileInputStream,gbk);
ZipEntry entry = zin.getNextEntry();
时间: 2024-12-11 07:10:56

Java操作Zip压缩文件遇到的编码问题的相关文章

java实现zip压缩文件

在网上找到这几种方法,感觉不错,收集起来,方便大家使用 jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,出现乱码问题,实现代码如下 /** * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件 * @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件: * 如果是文件,eg:D:\\MyEclipse\\fi

Java使用Zip压缩文件或整个目录

1.压缩文件或整个目录 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.zip.ZipEntry

c#操作Zip压缩文件

SharpZipLib 文件/文件夹压缩 一.ZipFile ZipFile类用于选择文件或文件夹进行压缩生成压缩包. 常用属性: 属性 说明 Count 文件数目(注意是在ComitUpdat之后才有) Password 压缩包密码 Size 压缩包占用空间大小 Name 压缩包名称,默认输出是文件路径 ZipEntry 压缩包里的文件,通过索引[]访问 其常用方法如下: 方法 说明 Add 添加要进行压缩的文件 AddDirectory 添加文件夹(不会压缩文件夹里的文件) Delete 删

java生成zip压缩文件,解压缩文件

1.生成zip public static void main(String[] args) { try { // testZip("c:\\temp.txt", "c:\\temp4.zip"); // testZip("c:\\Result.txt", "c:\\temp4.zip"); //不然会被一个文件覆盖了. //压缩多个文件的关键: ZipOutputStream out 作为参数传递. //一个流,否则存在覆盖

Java ZIP压缩文件使用总结

做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载.Java的JDK中提供一个java.util.zip的接口,供大家使用.如下图: 图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的. java.util.zip.ZipEntry; java.util.zip.ZipOutputStream; 下面的压缩过程主要是通过这两个接口压缩文件或者文件夹

dedecms中提取的zip压缩文件操作类zip.class.php

从织梦DeDeCMS中提取的zip压缩文件操作类,包含zip文件压缩.解压缩.添加文件到压缩包中等多个实用的函数,注释详细方便使用. 下载:dedecms中提取的zip压缩文件操作类zip.class.php 包含的函数和简单的使用方法: 1.函数get_List($zip_name) ,函数作用:获取zip文件中的文件列表.函数参数 $zip_name  zip文件名.返回值 文件列表数组. 2.函数Add($files,$compact),函数作用:增加文件到压缩文件.函数参数 $files

Java—将文件打包为zip压缩文件

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipE

java基础---->Zip压缩的使用(转)

java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使用 GZIP与ZIP压缩的比较 友情链接 关于压缩的简要说明 一. Java中有着压缩的类: CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压) CheckedOutputStream GetCheckSum()为任何OutputS

php实现ZIP压缩文件解压缩

测试使用了两个办法都可以实现: 第一个:需要开启配置php_aip.dll 1 <?php 2 //需开启配置 php_zip.dll 3 //phpinfo(); 4 header("Content-type:text/html;charset=utf-8"); 5 6 function get_zip_originalsize($filename, $path) { 7 //先判断待解压的文件是否存在 8 if(!file_exists($filename)){ 9 die(