【问题标题】:Writing xml files into zip file with ZipOutputStream - error when opening使用 ZipOutputStream 将 xml 文件写入 zip 文件 - 打开时出错
【发布时间】:2016-03-30 10:22:18
【问题描述】:

编辑:错误不在此代码中。前端下载错误。服务器上的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();
    }
}

【问题讨论】:

  • OutputStream 写入文件的代码在哪里?
  • 除此之外,您调用String.getBytes() 时没有指定编码。不要那样做 - 总是 指定编码。您还多次调用getBytes() - 一次获取长度,然后再次编写它们。我会为每个条目调用一次,将结果保存在byte[] 中。您可能希望将该逻辑提取到一个方法中,writeStringAsZipEntry 或类似的东西......
  • 本文由 Apache Camel 完成。这适用于其他文件,因此不包括在此处。 getBytes 调用仍然使用了两次,因为我没有先指定大小。这还有必要吗?
  • 运行代码并将字节写入文件,我得到一个包含两个条目和正确内容的 zip 文件。
  • 感谢您的尝试。不知道为什么我的文件不起作用。错误一定在其他地方。

标签: java xml zip bytearrayoutputstream zipoutputstream


【解决方案1】:

我相信错误不在此方法中。以下 sn-p 基于您发布的代码创建一个有效的 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,则应指定编码以确保文件内容不乱码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多