zip压缩问题

obhen 发布于 2017/10/25 11:07
阅读 340
收藏 0

java压缩了zip文件,linux下用unzip解压,中文名称乱码,网上查的都不对,1是用 ant下面的试过也是乱码2设置gbk还是乱码,3用过zip4j 解压还是乱码,设置编码gbk utf-8 也试过了,还是乱码,请教下大家有遇到这个问题的吗

加载中
0
hibegin
hibegin
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class ZipUtil {
    private static Logger LOGGER = LoggerFactory.getLogger(ZipUtil.class);
    public static void inZip(List<File> files, String basePath, File target) {
        List<File> cfiles = new ArrayList<>();
        for (File file : files) {
            cfiles.add(file);
        }
        for (File file : cfiles) {
            if (file.isDirectory()) {
                getAllFiles(file.toString(), files);
            }
        }
        ZipArchiveOutputStream zipOut = null;
        try {
            zipOut = new ZipArchiveOutputStream(new FileOutputStream(target));
            zipOut.setEncoding("Cp437");
            zipOut.setFallbackToUTF8(true);
            zipOut.setUseLanguageEncodingFlag(true);
            zipOut.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE);
            for (File file : files) {
                if (file.isFile()) {
                    if (basePath.endsWith("/")) {
                        basePath = basePath.substring(0, basePath.length() - 1);
                    }
                    zipOut.putArchiveEntry(new ZipArchiveEntry(file.toString().substring(basePath.length())));
                    byte[] b = new byte[1024 * 4];
                    int len;
                    InputStream is = new FileInputStream(file);
                    while ((len = is.read(b, 0, b.length)) != -1) {
                        zipOut.write(b, 0, len);
                    }
                    zipOut.closeArchiveEntry();
                    zipOut.flush();
                }
            }
        } catch (IOException e) {
            LOGGER.error("zip file error", e);
        } finally {
            if (zipOut != null) {
                try {
                    zipOut.close();
                } catch (IOException e) {
                    LOGGER.error("close output stream error", e);
                }
            }
        }
    }
    private static void getAllFiles(String path, List<File> files) {
        File file = new File(path);
        if (file.isDirectory()) {
            File[] fs = file.listFiles();
            if (fs != null) {
                for (File file2 : fs) {
                    if (file2.isDirectory()) {
                        getAllFiles(file2.getPath(), files);
                    } else {
                        files.add(file2);
                    }
                }
            }
        } else {
            files.add(file);
        }
    }
}

那可能是你还没有试过 common-scompress 吧

 

 

obhen
obhen
这个的确没试过,貌似解压还有点问题,我可以试试
0
依然菜刀
依然菜刀

估计是你访问linux的终端没有设置正确的编码

建议统一使用utf8

1、linux请设置编码为utf8

2、访问linux的putty或者xsehll请设置为utf8

3、java压缩zip的时候,请使用ant的jar包(设置编码为UTF8),或者使用JDK7才引入的设置编码的API

4、服务器上使用unzip解压的时候就OK了

5、如果是使用xftp或者winscp,则都需要设置为uft8才行

 

你可以通过如下的方式验证linux的编码是否OK:

在命令行输入:touch 中文.txt

然后通过zip命令将这个文件打包为zip,然后下载到本地(windows),使用7z(注意是7z,winrar对编码支持不好,会乱码)解压后,看是不是可以得到中文.txt

obhen
obhen
1,2,5 全部是utf-8 3ant也试过了,开始的 时候就说了,jdk是8不存在你说的 问题 4就是unzip解压不对,开始的时候也说了,下面的验证刚刚试过是没有问题的
0
两广总督bogang
两广总督bogang
不要用中文名
obhen
obhen
这是需求,我没的改。
0
Feng_Yu
Feng_Yu

unzip -O gbk /path/to/your.zip

obhen
obhen
回复 @Feng_Yu : 这个我们是给客户提供的zip,他们解压。。。。我在linux上操作也是一样的也是乱码,在linux上打包,然后unzip也是乱的
Feng_Yu
Feng_Yu
回复 @obhen : -O CHARSET specify a character encoding for DOS, Windows and OS/2 archives 或者干脆考虑使用强制UTF-16编码的7z,完全开放的格式,跟zip一样
Feng_Yu
Feng_Yu
回复 @obhen : 那你的unzip版本不对啊,unzip早就支持-O参数指定编码了
obhen
obhen
不好意思,这个也试过了,服务器上压根就没有这个 -O
0
obhen
obhen

我的解决方案是在代码里调用linux下的zip命令解决的。此贴终结。

返回顶部
顶部