Java.util.zip.ZipException:在ZipoutStream中使用putNextEntry()时,条目大小无效(预期为18401,但得到0字节)?

Java.util.zip.ZipException:在ZipoutStream中使用putNextEntry()时,条目大小无效(预期为18401,但得到0字节)?,java,inputstream,outputstream,zipoutputstream,zipinputstream,Java,Inputstream,Outputstream,Zipoutputstream,Zipinputstream,我将一个包含5个文件的zip文件转换为一个字节数组。我想从bytearray在磁盘上输出一个zip文件。我的过程是首先将字节[]读入ByteArrayInputStream,然后读入ZipInputStream InputStream plainTextStream = new ByteArrayInputStream(plainText); ZipInputStream zipInStream = new ZipInputStream(plainTextStream); 我想把它输出到我磁盘

我将一个包含5个文件的zip文件转换为一个字节数组。我想从bytearray在磁盘上输出一个zip文件。我的过程是首先将字节[]读入ByteArrayInputStream,然后读入ZipInputStream

InputStream plainTextStream = new ByteArrayInputStream(plainText);
ZipInputStream zipInStream = new ZipInputStream(plainTextStream);
我想把它输出到我磁盘上的一个zip文件中,所以在这里我想我需要一个文件和一个传递该zip文件的ZipOutPutStream

ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(file));
使用zip条目,我使用缓冲区遍历ZipInPutStream并将每个条目写入FileOutputStream。在每个主循环的末尾,我将一个条目放入ZipOutPutStream

    ZipEntry entry = null;
    while((entry = zipInStream.getNextEntry()) != null){
        FileOutputStream fileOutStream = new FileOutputStream(entry.getName());
        byte[] byteBuff = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = zipInStream.read(byteBuff)) != -1)
        {
            fileOutStream.write(byteBuff, 0, bytesRead);
        }
        fileOutStream.close();
        zipOutStream.putNextEntry(entry);
        zipInStream.closeEntry();
    }
我从zip添加了第一个文件(共有5个文件),但是当尝试添加第二个文件时,我在

zipOutStream.putNextEntry(entry)

java.util.zip.ZipException: invalid entry size (expected 18401 but got 0 bytes)
通过调试,我不知道哪里出了问题。我假设它可能与放入第一个outputstream(entry.getName())时的缓冲区有关?字节读取while循环可能是一个问题。
这都是假设逻辑是合理的。我希望我能找到解决此错误的方法。

您从未将压缩文件的内容写入压缩输出流

您不需要将输出写入文件流,只需将其直接写入zip输出流即可

您应该使用try with资源

try(ZipInputStream-zipInStream=new-ZipInputStream(new-ByteArrayInputStream(纯文本));
zipOutStream zipOutStream=新zipOutStream(新文件输出流(文件));
) {
byte[]byteBuff=新字节[1024];
for(ZipEntry entry;(entry=zipInStream.getNextEntry())!=null;){
zipOutStream.putNextEntry(条目);
for(int bytesRead;(bytesRead=zipInStream.read(byteBuff))!=-1;){
write(byteBuff,0,bytesRead);
}
}
}

无需调用
closeEntry()

,除非您正在编辑文件(显示的代码中没有),否则将输入流解码并重新编码为ZIP完全是浪费时间。只需将原始输入流复制到文件输出流。您的复制循环是正常的,只是目前您正在写入错误的流。另外,您假设输入中没有目录项。我很感激。为什么不需要closeEntry()?我认为只要有一个条目被放入zipOutStream,就需要它。putNextEntry(条目)是否消除了需要?此外,生成的zip文件相同,但大小不同,大小相差约kb。这正常吗?@AlMahiyan 1)阅读文档--2)他们可能使用了不同的压缩方法或级别。