我的代码从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。