Java ZipEntry未正确存储图像
我正在尝试创建一个KMZ文件,为此我已在程序中传递了图像。当我提取KMZ文件时,它正在创建Java ZipEntry未正确存储图像,java,io,kml,google-earth,kmz,Java,Io,Kml,Google Earth,Kmz,我正在尝试创建一个KMZ文件,为此我已在程序中传递了图像。当我提取KMZ文件时,它正在创建files文件夹,并将图像存储到该路径中,但图像不可见,但最后一个图像可见,但名称和图像不同 public static void createKMZ(String kmlData) throws IOException { FileOutputStream fos = new FileOutputStream(KMZ); ZipOutputStream zoS = ne
files
文件夹,并将图像存储到该路径中,但图像不可见,但最后一个图像可见,但名称和图像不同
public static void createKMZ(String kmlData) throws IOException {
FileOutputStream fos = new FileOutputStream(KMZ);
ZipOutputStream zoS = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry(KML);
zoS.putNextEntry(ze);
PrintStream ps = new PrintStream(zoS);
ps.println(kmlData);
ps.flush();
zoS.closeEntry();
// now add image file entry to KMZ
FileInputStream is = null;
FileInputStream is1 = null;
FileInputStream is2 = null;
FileInputStream is3 = null;
FileInputStream is4 = null;
FileInputStream is5 = null;
FileInputStream is6 = null;
try {
is = new FileInputStream("files/grn-pushpin.png");
is1 = new FileInputStream("files/ltblu-pushpin.png");
is2 = new FileInputStream("files/pink-pushpin.png");
is3 = new FileInputStream("files/purple-pushpin.png");
is4 = new FileInputStream("files/red-pushpin.png");
is5 = new FileInputStream("files/wht-pushpin.png");
is6 = new FileInputStream("files/ylw-pushpin.png");
ZipEntry zEnt = new ZipEntry("files/grn-pushpin.png");
ZipEntry zEnt1 = new ZipEntry("files/ltblu-pushpin.png");
ZipEntry zEnt2 = new ZipEntry("files/pink-pushpin.png");
ZipEntry zEnt3 = new ZipEntry("files/purple-pushpin.png");
ZipEntry zEnt4 = new ZipEntry("files/red-pushpin.png");
ZipEntry zEnt5 = new ZipEntry("files/wht-pushpin.png");
ZipEntry zEnt6 = new ZipEntry("files/ylw-pushpin.png");
zoS.putNextEntry(zEnt);
zoS.putNextEntry(zEnt1);
zoS.putNextEntry(zEnt2);
zoS.putNextEntry(zEnt3);
zoS.putNextEntry(zEnt4);
zoS.putNextEntry(zEnt5);
zoS.putNextEntry(zEnt6);
// copy image input to KMZ outputWWW
// write contents to entry within compressed KMZ file
IOUtils.copy(is, zoS);
IOUtils.copy(is1, zoS);
IOUtils.copy(is2, zoS);
IOUtils.copy(is3, zoS);
IOUtils.copy(is4, zoS);
IOUtils.copy(is5, zoS);
IOUtils.copy(is6, zoS);
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(is1);
IOUtils.closeQuietly(is2);
IOUtils.closeQuietly(is3);
IOUtils.closeQuietly(is4);
IOUtils.closeQuietly(is5);
IOUtils.closeQuietly(is6);
}
zoS.closeEntry();
zoS.close();
}
调用putNextEntry()
开始写入新的ZIP文件条目,将流定位到条目数据的开头,如果仍然处于活动状态,则关闭当前条目。因此,如果不先将内容写入该条目,则无法调用putNextEntry()
如上所述,除最后一个图像文件外,所有文件都将是零字节文件
需要重新排列调用顺序:
ZipEntry zEnt1 = new ZipEntry();
zoS.putNextEntry(zEnt1);
IOUtils.copy(is1, zoS);
zoS.closeEntry();
ZipEntry zEnt2 = new ZipEntry();
zoS.putNextEntry(zEnt2);
IOUtils.copy(is2, zoS);
zoS.closeEntry();
...
或者像这样简化:
private static void createEntry(String name, ZipOutputStream zoS) throws IOException {
try(FileInputStream is = new FileInputStream(name)) {
ZipEntry zEnt = new ZipEntry(name);
zoS.putNextEntry(zEnt);
IOUtils.copy(is, zoS);
zoS.closeEntry();
}
}
public static void createKMZ(String kmlData) throws IOException {
FileOutputStream fos = new FileOutputStream(KMZ);
ZipOutputStream zoS = new ZipOutputStream(fos));
...
PrintStream ps = new PrintStream(zoS);
ps.println(kmlData);
ps.flush();
zoS.closeEntry();
// now add image file entries to KMZ
createEntry("files/grn-pushpin.png", zoS);
createEntry("files/ltblu-pushpin.png", zoS);
createEntry("files/pink-pushpin.png", zoS);
createEntry("files/purple-pushpin.png", zoS);
createEntry("files/red-pushpin.png", zoS);
createEntry("files/wht-pushpin.png", zoS);
createEntry("files/ylw-pushpin.png", zoS);
zoS.close();
}
一次尝试一个图像和一个条目<代码>ZipEntry zEnt1=新ZipEntry();佐斯·普特内森特里(zEnt1);IOUtils.copy(is1,zoS),zoS.closeEntry()代码>然后进入zEnt2,等等。