使用Java解压带有Unicode文件名的压缩文件

5
如何解压带有Unicode文件名的zip文件? 以下是我的代码:
try {
    ZipInputStream zis = new ZipInputStream(
            new FileInputStream(zipFile));
    ZipEntry ze = zis.getNextEntry();

    System.setProperty("file.encoding", "UTF-8");
    while (ze != null) {
        String fileName = new String(ze.getName().getBytes("UTF-8"));
        System.out.println(fileName);
        File newFile = new File(outputFolder + File.separator + fileName );

        BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(newFile));
        OutputStreamWriter osw = new OutputStreamWriter(outStream, Charset.forName("UTF-8"));
        int ch;
        StringBuffer buffer1 = new StringBuffer();
        while ((ch = zis.read()) > -1) {
            buffer1.append((char) ch);
        }
        osw.write(buffer1.toString());
        osw.close();
        outStream.close();

        ze = zis.getNextEntry();
    }

    zis.closeEntry();
    zis.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

但我收到了错误:UTFDataFormatException
06-05 08:46:33.394: W/System.err(777): java.io.UTFDataFormatException: bad second or third byte at 6 
06-05 08:46:33.394: W/System.err(777): at java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:56) 
06-05 08:46:33.426: W/System.err(777): at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:270) 
06-05 08:46:33.426: W/System.err(777): at com.learnlang.utility.ZipManager.unZipIt(ZipManager.java:62) 
06-05 08:46:33.434: W/System.err(777): at com.learnlang.HomeActivity$progressThread.run(HomeActivity.java:317) 

我的类名是ZipManager

如何解决这个问题?


请提供异常的完整堆栈跟踪。 - Andremoniy
06-05 08:46:33.394: W/System.err(777): java.io.UTFDataFormatException: 第6个字节的第二或第三个字节错误 06-05 08:46:33.394: W/System.err(777): at java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:56) 06-05 08:46:33.426: W/System.err(777): at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:270) 06-05 08:46:33.426: W/System.err(777): at com.learnlang.utility.ZipManager.unZipIt(ZipManager.java:62) 06-05 08:46:33.434: W/System.err(777): at com.learnlang.HomeActivity$progressThread.run(HomeActivity.java:317)我的类是ZipManager。 - shuttle1978
你确定文件名是UTF-8编码的吗?看起来解码UTF-8文件名失败了。 - Uwe Plonus
文件名的编码方式取决于操作系统。你使用的是Windows、OS X、Linux还是其他操作系统? - Joni
1
嗨,Shuttle1978,我在这里遇到了同样的问题。你最终解决了吗? - Bowie
我有同样的问题!请提供您的解决方案。 - Behrouz.M
1个回答

0
根据异常提示,您的文件实际上不是使用 UTF-8 编码。
此外,问题并不在于文件名。这一行:
 String fileName = new String(ze.getName().getBytes("UTF-8"));

这是没有意义的,因为ze.getName()已经是正确的Java字符串。


我正在尝试解压缩的文件名是“de_Maße-und-Gewichte_de”,我已经尝试过只使用ze.getName(),但它不起作用。 - shuttle1978
@shuttle1978,“它不起作用”是什么意思?在这种情况下,您收到了什么样的异常? - Andremoniy
1
相同的异常UTFDataFormatException。 - shuttle1978
使用以下代码创建文件对象:File newFile = new File(outputFolder + File.separator + e.getName());异常保持不变。 - shuttle1978
@shuttle1978,你收到相同的异常只是因为问题不在文件名上,而是在整个文件的编码上。 - Andremoniy
1
好的,但是如果我手动解压文件,它可以正常工作,并且我可以看到文件“de_Maße-und-Gewichte_de”,但是使用Java代码时我遇到了问题。 - shuttle1978

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接