pre
在写一段涉及文件解压代码的时候遇到了ZipEntry.isDirectory()判断错误,导致解压代码把空文件夹当做文件处理的问题。
jdk: 1.8.0_144
问题代码
if (entry.isDirectory()) {
new File(destDir + entry.getName()).mkdirs();
continue;
}
问题分析
通过分析JDK源码可以确认问题愿意,在JDK中的isDirectory的判断逻辑就存在问题,在文件夹分隔符与写死的不一致时就会出现问题。
/**
* Returns true if this is a directory entry. A directory entry is
* defined to be one whose name ends with a '/'.
* @return true if this is a directory entry
*/
public boolean isDirectory() {
return name.endsWith("/");
}
解决方案
借鉴JDK中的思路,自己写出符合跨平台要求的判断是否是文件夹的代码
if (entry.getName().endsWith(File.separator)) {
new File(destDir + entry.getName()).mkdirs();
continue;
}