使用重音解压缩zip文件

时间:2012-03-01 10:08:56

标签: java parsing zip diacritics

我正在使用Java机制来提取zip文件。如果标题中没有带重音符号的文件,则该机制可以正常工作。因为我来自葡萄牙,所以像ã,ç,õ,é等字符通常用在我的语言中。如果任何此字符都在文件名中,则会发生IO异常。

while (zipFileEntries.hasMoreElements()) {
    ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();    
    File destFile = new File(unzipDestinationDirectory, currentEntry);
    File destinationParent = destFile.getParentFile();

    // create the parent directory structure if needed
    destinationParent.mkdirs();

    // extract file if not a directory
    if (!entry.isDirectory()) {                 
        BufferedInputStream is =
            new BufferedInputStream(zip_file.getInputStream(entry));
        int currentByte;                
        byte data[] = new byte[BUFFER];

        // write the current file to disk
        FileOutputStream fos = new FileOutputStream(destFile);                  
        BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);

        // read and write until last byte is encountered
        while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
            dest.write(data, 0, currentByte);
        }

        dest.flush();
        dest.close();
        is.close();
    }

它在while((currentByte = is.read(data, 0, BUFFER)) != -1)

上崩溃了
java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at parsers.ZipParser.decompressZipFile(ZipParser.java:83)
    at poc.MainPOC.main(MainPOC.java:61)

您是否了解处理此问题的任何解决方法?我可以在不解压缩的情况下更改zip文件的文件名吗?

2 个答案:

答案 0 :(得分:3)

从Java 7开始,有一种方法可以ZipInputStream指定一个用于文件名的字符集。请参阅文档here

因此,您可以使用以下内容创建ZipInputStream

ZipInputStream zis = new ZipInputStream(new FileInputStream("your zip file"), Charset.forName("Encoding here"));

请参阅Charset以获取有关如何使用它的更多信息。

它不会改变您阅读文件的方式,因此您需要另一种解决方法来阅读内容。但是有关更多信息,请参阅此答案Java zip character encoding,您可以重复使用某些代码。

答案 1 :(得分:0)

我认为在压缩和解压缩时必须正确设置编码。你创建ZIP文件时是否创建了UTF-8?如果没有,我建议你尝试一下。