3

使用事例

Google Earth のネットワーク リンクの kmz 応答に文字列の kml をパッケージ化する必要があります。アイコンなどもそのうちまとめたいと思います。

問題

以下の実装を使用すると、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.

更新文字列を一時ファイルに保存しても、エラーが発生します。うーん。

ユース ケースのメモこのユース ケースは Web アプリで使用するためのものですが、ファイルのリストを取得するコードはそこでは機能しません。詳細については、how-to-access-local-files-on-server-in-jboss-application を参照してください。

4

1 に答える 1

4

を呼び出すのを忘れましclose()ZipOutputStream。それを呼び出すのに最適な場所は、それが作成されたブロックfinallyのブロックです。try


更新:フォルダを作成するには、エントリ名の前にその名前を追加するだけです。

ZipEntry entry = new ZipEntry("icons/" + file);
于 2010-07-09T23:02:29.520 に答える