如何防止制作一个空的zip文件

时间:2014-09-03 06:07:40

标签: java spring-mvc

我正在生成一个图像文件的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;
    }

2 个答案:

答案 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。