Java ZipEntry 到字节数组

Java ZipEntry to bytes array

这是我的代码:

final InputStream inputStream = MY_RECEIVED_INPUT_STREAM;
ZipInputStream zis = new ZipInputStream(inputStream);

ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
        zipEntry = zis.getNextEntry();
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
zis.closeEntry();
zis.close();

我收到了 zip 文件,里面有很多文件。我想将这些文件写入数据库。我想要的是从每个 ZipEntry 获取字节并将它们作为 Blob(xxxxxx ....部分)保存到数据库中。 如何从 zipEntry 获取字节? 我没有 ZipFile,所以我不能使用这样的东西:

InputStream stream = zipFile.getInputStream(entry);

byte[] bytes = IOUtils.readAllBytes(zipFile.getInputStream(entry));

提前致谢。

ZipFile 使其更易于阅读,但基本规则是 ZipInputStream 与当前 ZipEntry 相关的内容对齐。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/zip/ZipInputStream.html#read(byte%5B%5D,int,int)

直接从 zis 读取直到 0,并且 在处理所有条目之前不要 close()

    ZipEntry zipEntry;
    while ((zipEntry = zis.getNextEntry()) != null) {
      // xxx Do BLOB creation
      zis.transferTo(outputStream); // Java9
    }

(PS 你不需要调用 closeEntry())

你可以这样使用:

    InputStream is = MY_RECEIVED_INPUT_STREAM;
    BufferedInputStream bis = null;
    ZipInputStream zis = null;
    ByteArrayOutputStream out = null;
    String name = null;
    byte[] b = new byte[8192];
    int len = 0;

    try {
        bis = new BufferedInputStream(is);
        zis = new ZipInputStream(bis);

        ZipEntry zipEntry = null;
        while ((zipEntry = zis.getNextEntry()) != null) {
            //name of file
            name = zipEntry.getName();

            if (zipEntry.isDirectory()) {
                //I'm skipping directories in this example
                continue;
            }

            out = new ByteArrayOutputStream();

            while ((len = zis.read(b)) > 0) {
                out.write(b, 0, len);
            }

            //save to DB - db_save(String file_name, byte[] file_bytes)
            db_save(name,out.toByteArray());
            out.close();
        }
    } finally {
        if (zis != null) {
            zis.close();
        }
        if (bis != null) {
            bis.close();
        }
        if (is != null) {
            is.close();
        }

    }