使用事例
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 を参照してください。