我正在生成一个图像文件的zip。但是如果找不到图像,那么它会生成像java.util.zip.ZipException: ZIP file must have at least one entry
这样的异常。我正在处理异常但是生成了一个0大小的空zip。所以请帮我解决这个问题
try {
// create the ZIP file
ZipOutputStream out = getOutputStream(subpart, destinationZipPath);
/*
* ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
* destinationZipPath));
*/
// compress the files
LOGGER.error("zip creation is started @" + new Date().toString());
for (String fileNameDB : filesTobeZipped) {
// To check duplication of filename in zip creation
if (!filesHash.containsKey(fileNameDB)) {
filesHash.put(fileNameDB, fileNameDB);
File f = new File(sourceFolder + fileNameDB);
// to chk file is exists on physical location or not
if (f.exists()) {
if (fileCount >= batchFileLimit) {
out.close();
subpart++;
out = getOutputStream(subpart, destinationZipPath);
fileCount = 0;
// overallSize=0;
}
FileInputStream in = new FileInputStream(f);
// add ZIP entry to output stream
out.putNextEntry(new ZipEntry(f.getName()));
// transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// complete the entry
out.closeEntry();
in.close();
fileCount++;
} else {
}
}
}
// complete the ZIP file
out.close(); // Exception if fileCount=0;
return true;
// return zipfile;
} catch (IOException ex) {
return false;
}
答案 0 :(得分:2)
在检测到第一个现有文件后,您是否只能创建ZIP流。就像
ZipOutputStream out = null;
for (String fileNameDB : filesTobeZipped) {
if (new File(fileNameDB).exists()) {
if (out == null) {
out= ZipOutputStream out = getOutputStream(subpart, destinationZipPath);
}
// do other operations
}
}
答案 1 :(得分:0)
你可以这样做:
ZipOutputStream out = null;
try {
out = getOutputStream(subpart, destinationZipPath);
...
out.close(); // Exception if fileCount=0;
return true;
// return zipfile;
} catch (IOException ex) {
if (out != null) {
out.close();
}
destinationZipPath.toFile().delete(); // Or whatever is appropriate.
return false;
}
也许更好的是在循环中有一个try-catch。并检查文件数量。
然后你可以使用try-with-resources。