我有一个将inputStream添加到zip作为条目的方法:

private void addToZip(InputStream is, String filename) throws Exception {
    try {
        ZipEntry zipEntry = new ZipEntry(filename);
        zos.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = is.read(bytes)) >= 0) {
            zos.write(bytes, 0, length);
        }
        zos.closeEntry();
    } finally {
        IOUtils.closeQuietly(is);
    }
}

当文件名包含UTF-8字符(如áé...)时,会发生问题。在zip文件中,它将保存为?????,而当我在ubuntu 12.10中解压缩它时,它看起来像:N├бstroje而不是Nástroje

对于此示例,我使用了jdk6,但现在我也尝试了jdk7:
zos = new ZipOutputStream(fos, Charset.forName("UTF-8"));

但是没有成功。

我还尝试了Apache Commons Zip并设置了编码,但是也没有成功。

那么,如何在文件名中将带有unicode符号的文件添加到zip中呢?

最佳答案

似乎这行解决了我的问题:

        zos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS);

有人可以向我解释这是怎么做的,为什么会起作用?

10-06 16:08