Java ZipEntry未正确存储图像

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

我正在尝试创建一个KMZ文件,为此我已在程序中传递了图像。当我提取KMZ文件时,它正在创建
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,等等。