如何使用java.util.zip归档/缩小java中的字符串以便在Google Earth中使用?

时间:2010-07-09 13:49:21

标签: java zip kmz

用例

我需要将我们在字符串中的kml打包成一个kmz响应,用于Google地球中的网络链接。我还想把它们包起来等等。

问题

使用下面的实现,我收到来自WinZip和Google Earth的错误,表明存档已损坏或无法分别打开文件。与我构建的其他示例不同的部分是添加字符串的行:

ZipEntry kmlZipEntry = new ZipEntry("doc.kml");
out.putNextEntry(kmlZipEntry);
out.write(kml.getBytes("UTF-8"));

请指出我正确的方向正确写入字符串,使其在生成的kmz文件中位于doc.xml。我知道如何将字符串写入临时文件,但我非常希望将操作保留在内存中以便于理解和提高效率。

    private static final int BUFFER = 2048;
    private static void kmz(OutputStream os, String kml)
    {
        try{
            BufferedInputStream origin = null;
            ZipOutputStream out = new ZipOutputStream(os);
            out.setMethod(ZipOutputStream.DEFLATED);
            byte data[] = new byte[BUFFER];
            File f = new File("./icons"); //folder containing icons and such
            String files[] = f.list();

            if(files != null)
            {
                for (String file: files) {
                    LOGGER.info("Adding to KMZ: "+ file);
                    FileInputStream fi = new FileInputStream(file);
                    origin = new BufferedInputStream(fi, BUFFER);
                    ZipEntry entry = new ZipEntry(file);
                    out.putNextEntry(entry);
                    int count;
                    while((count = origin.read(data, 0, BUFFER)) != -1) {
                        out.write(data, 0, count);
                    }
                    origin.close();
                }
            }
            ZipEntry kmlZipEntry = new ZipEntry("doc.kml");
            out.putNextEntry(kmlZipEntry);
            out.write(kml.getBytes("UTF-8"));
        }
        catch(Exception e)
        {
            LOGGER.error("Problem creating kmz file", e);
        }
    }

奖励积分,用于向我展示如何将icons文件夹中的补充文件放入存档中的类似文件夹,而不是与doc.kml处于同一层。

更新即使将字符串保存到临时文件,也会发生错误。啊。

用例注释该用例适用于Web应用程序,但获取文件列表的代码无法在此处运行。有关详细信息,请参阅how-to-access-local-files-on-server-in-jboss-application

1 个答案:

答案 0 :(得分:4)

您忘记在close()上致电ZipOutputStream了。调用它的最佳位置是创建它的finally块的try块。


更新:要创建文件夹,只需在条目名称中添加其名称。

ZipEntry entry = new ZipEntry("icons/" + file);