使用ZipOutputStream将xml文件写入zip文件 - 打开

时间:2016-03-30 10:22:18

标签: java xml zip bytearrayoutputstream zipoutputstream

编辑:错误不在此代码中。前端的下载是错误的。服务器上的zip很好,但通过js下载它不起作用。

我正在将两个xml文件写入zip文件。我无法打开生成的文件(错误:没有文件,也没有文件夹)。

Tuple是一个包含两个字符串(A和B)的类,我的xml内容。我首先在没有closeEntry且没有setSize的情况下尝试了此操作,结果是相同的。

有什么想法吗?我该怎么调试呢?

private static byte[] createArchive(final Tuple<String, String> body) throws IOException {

    try (final ByteArrayOutputStream bos = new ByteArrayOutputStream();
         final ZipOutputStream zos = new ZipOutputStream(bos)) {

        final ZipEntry firstEntry = new ZipEntry("first.xml");
        firstEntry.setSize(body.getA().getBytes().length);
        zos.putNextEntry(firstEntry);
        zos.write(body.getA().getBytes());
        zos.closeEntry();

        final ZipEntry secondEntry = new ZipEntry("second.xml");
        secondEntry.setSize(body.getB().getBytes().length);
        zos.putNextEntry(secondEntry);
        zos.write(body.getB().getBytes());
        zos.closeEntry();

        zos.close();

        return bos.toByteArray();
    }
}

1 个答案:

答案 0 :(得分:0)

我相信错误不在这个方法中。以下基于您发布的代码的代码段创建了一个有效的ZIP存档。

try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(bos)) {

    byte[] fileA = Files.readAllBytes(Paths.get("/tmp/fileA.xml"));
    byte[] fileB = Files.readAllBytes(Paths.get("/tmp/fileB.xml"));
    ZipEntry firstEntry = new ZipEntry("first.xml");
    firstEntry.setSize(fileA.length);
    zos.putNextEntry(firstEntry);
    zos.write(fileA);
    zos.closeEntry();

    ZipEntry secondEntry = new ZipEntry("second.xml");
    secondEntry.setSize(fileB.length);
    zos.putNextEntry(secondEntry);
    zos.write(fileB);
    zos.closeEntry();
    zos.close();

    Files.write(Paths.get("/tmp/files.zip"), bos.toByteArray());
}

检查存档

jar vtf /tmp/files.zip
     5 Wed Mar 30 13:15:02 CEST 2016 first.xml
     5 Wed Mar 30 13:15:02 CEST 2016 second.xml

正如Jon Skeet提到的那样,它很可能与body.getA()有关。如果此方法返回String,则应指定编码以确保文件内容不会出现乱码。