将文件添加到Java

时间:2015-05-22 14:56:47

标签: java zip directory

我有一个包含zip的zip文件,其中包含我必须添加一些文件的文件夹。结构就像

outerZip.zip
    |folder
        |innerZip.zip
            |innerFolder

我需要在内部文件夹中添加一些文件。

我可以返回innerZip ok,如果我将它保存到文件中它会显示正确的结构。

现在,当我想迭代第一个条目的innerZip的ZipEntries时,它显示为/ innerFolder,但是当我想将条目内容添加到更新的zip文件时,它发现它包含数据并抛出低于错误:

java.util.zip.ZipException: invalid entry CRC (expected 0x0 but got 0x46480bab)
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:218)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at zip.builder.InnerBuilder.addFilesToInnerZip(InnerBuilder.java:179)
    at zip.builder.InnerBuilder.addFilesToZip(InnerBuilder.java:117)

代码在这里:

private byte[] addFilesToZip(byte[] outerZipBytes, Set<File> files) {
    String zipPath = System.getProperty("catalina.home") + File.separator + "outerZipFile.zip";
    File zipFile = new File(zipPath);
    ZipFile outerZipFile = null;

    try {
        zipFile.createNewFile();
        FileOutputStream fileout = new FileOutputStream(zipFile);
        fileout.write(outerZipBytes);
        fileout.close();

        outerZipFile = new ZipFile(zipFile);
        File innerZipFile = getInnerZipFile(outerZipFile);
        addFilesToInnerZip(innerZipFile, files);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (outerZipFile != null)
                outerZipFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // TODO convert updated outer zip file to byte array
    return new byte[0];
}

private File getInnerZipFile(ZipFile outerZipFile) throws IOException {

    String innerZipPath = System.getProperty("catalina.home") + File.separator + "innerZipFile.zip";
    ZipEntry entry = outerZipFile.getEntry("folder/inner.zip");
    InputStream innerZipInputStream = outerZipFile.getInputStream(entry);
    FileOutputStream fout = new FileOutputStream(new File(innerZipPath));
    byte[] buf = new byte[1024];
    int data;
    while ((data = innerZipInputStream.read(buf)) != -1) {
        fout.write(buf, 0, data);
    }
    innerZipInputStream.close();
    fout.close();
    return new File(innerZipPath);
}

private void addFilesToInnerZip(File zipFile, Set<File> files) throws IOException {
    File tempFile = File.createTempFile(zipFile.getName(), null);
    tempFile.delete();
    zipFile.renameTo(tempFile);
    byte[] buf = new byte[1024];

    ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));
    ZipEntry entry = zin.getNextEntry();
    while (entry != null) {
        // Add ZIP entry to output stream.
        out.putNextEntry(new ZipEntry(entry.getName()));
        // Transfer bytes from the ZIP file to the output file
        int len;
        while ((len = zin.read(buf)) > 0) { // line 179
            out.write(buf, 0, len);
        }
        entry = zin.getNextEntry();
    }
    for (File file : files) {
        InputStream in = new FileInputStream(file);
        out.putNextEntry(new ZipEntry("innerFolder/"+ file.getName()));
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        out.closeEntry();
        in.close();
    }
    zin.close();
    out.close();
    tempFile.delete();
}

感谢您的帮助!

0 个答案:

没有答案