我在解压缩文件时遇到问题,其中目录的名称末尾没有“/”。
如果文件内容是,则代码可以正常工作:
BASEDIR/
BASEDIR/file1.txt
BASEDIR/file2.txt
当中央目录的名称末尾不包含“/”时,出现错误。在这种情况下,zip 文件的内容是:
BASEDIR
BASEDIR/file1.txt
BASEDIR/file2.txt
这是我用来解压缩文件的代码
public static
void unzip(final String zipFilename, final String unzipDir)
throws ZipException {
ZipFile zipFile = null;
try {
final File directory = new File(unzipDir);
// Check if the directory to extract to exists
if(!directory.exists()) {
// If not, create a new one.
new File(unzipDir).mkdir();
}
final File checkFile = new File(zipFilename);
if (checkFile.length() == 0) {
throw new IOException("Empty file");
}
zipFile = new ZipFile(zipFilename);
Enumeration<?> e = zipFile.entries();
while(e.hasMoreElements()) {
final ZipEntry entry = (ZipEntry)e.nextElement();
final File destinationFile = new File(unzipDir,entry.getName());
//create directories if required.
destinationFile.getParentFile().mkdirs();
//if the entry is directory, leave it. Otherwise extract it.
if(entry.isDirectory()) {
continue;
}
else {
// Get the InputStream for current entry of the zip file using
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(destinationFile);
writeFile(is, fos);
}
}
}
catch(Exception ex) {
throw new ZipException("error", ex);
}
finally {
if(zipFile!=null) {
try {
zipFile.close();
}
catch(Exception ex) {
throw new ZipException("error", ex);
}
}
}
}
我发现问题是 ZipEntry.isDirectory() 方法,该方法仅在 zip 中的条目名称以“/”结尾时才有效(http://docs.oracle.com/javase/6/docs/api/java/ util/zip/ZipEntry.html#isDirectory%28%29),所以它在第二种情况下不起作用。我无法找到解决此行为的方法。如何在不使用 isDirectory 方法的情况下检查条目是否为目录?(请注意,我不能使用第三方库)