从 zip 文件中读取带有特殊字符的文件



我的代码从zip文件中读取文件,除了带有特殊字符的文件外,它工作正常。有问题的字符是"è"(请参阅我的代码fère_champenoise)

String works="(3/(3)_juno.jpa";
     String sdoesntwork="ba/battle of fère_champenoise.jpa";
    ZipFile file1 = null;
    try {
      file1 = new ZipFile(sZipFileOld);
    } catch (IOException e) {
      System.out.println("Could not open zip file " + sZipFileOld + ": " + e);
    }
    try {
        file1.getInputStream(file1.getEntry(sdoesntwork));
    } catch (IOException e) {
        System.out.println(sdoesntwork + ": IO Error " + e);
        e.printStackTrace();
    }

它抛出错误,但不通过异常处理程序:

Exception in thread "main" java.lang.NullPointerException
    at java.util.zip.ZipFile.getInputStream(Unknown Source)
    at ZipCompare.main(ZipCompare.java:56)

任何解决方案 ?

构造 zip 文件时,显式指定编码: file1 = new ZipFile(sZipFileOld, Charset.forName("IBM437"));

Zip 文件对特殊字符不使用默认的 UTF-8 编码

我相信

您可能需要指定一种编码,UTF-8。像这样:

 final InputStream in = new InputStreamReader(file1.getInputStream(file1.getEntry(sdoesntwork)), "utf-8");

确保您记得最后关闭它。

问题是file1.getEntry(sdoesntwork)返回 null,因为它找不到该条目。如果您确定此名称正确,请尝试使用:

file1 = new ZipFile(sZipFileOld,StandardCharsets.UTF_8);

它不会通过您的异常处理程序,因为是另一种类型的异常,Null 指针异常会因为找不到该条目而引发。您应该检查文件的定义方式或使用哪个字符集。

file1 = new ZipFile(sZipFileOld,StandardCharsets.UTF_8);

charset - 用于解码 ZIP 条目名称和注释的字符集(如果设置了 ZIP 条目的通用位标志的语言编码位,则忽略)。

如果 zip 条目及其注释是 ASCII,则无需使用这种方式来构造 ZipFile。

相关内容

  • 没有找到相关文章

最新更新