Как использовать java.util.zip для архивирования / удаления строки в java для использования в Google Earth? - PullRequest
3 голосов
/ 09 июля 2010

Вариант использования

Мне нужно упаковать наш kml, который находится в строке, в ответ kmz для сетевого соединения в Google Earth. Я хотел бы также обернуть значки и тому подобное, пока я на нем.

Проблема

Используя приведенную ниже реализацию, я получаю ошибки от WinZip и Google Earth о том, что архив поврежден или что файл не может быть открыт соответственно. Часть, которая отличается от других примеров, из которых я построил это, это строки, в которые добавляется строка:

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

Пожалуйста, укажите мне в правильном направлении, чтобы правильно написать строку, чтобы она была в doc.xml в результирующем файле kmz. Я знаю, как записать строку во временный файл, но мне бы очень хотелось сохранить эту операцию в памяти для большей понятности и эффективности.

    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.

Обновление Даже при сохранении строки во временный файл возникают ошибки. Тьфу.

Use Case Note Этот вариант использования предназначен для использования в веб-приложении, но код для получения списка файлов там работать не будет. Подробнее см. как получить доступ к локальным файлам на сервере в jboss-приложении

1 Ответ

4 голосов
/ 10 июля 2010

Вы забыли позвонить close() на ZipOutputStream.Лучшее место для его вызова - блок finally блока try, в котором он был создан.


Обновление : чтобы создать папку, просто добавьте ее имя в полеимя записи.

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