编辑:错误不在此代码中。前端的下载是错误的。服务器上的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();
}
}
答案 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
,则应指定编码以确保文件内容不会出现乱码。