You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Java内存中将Zip byte[]转换为Unzip byte[]的代码实现

内存中Zip byte[] 转 Unzip byte[] 的Java实现

没问题,我帮你实现这个纯内存的解压缩需求,完全不需要写入中间文件。下面是代码片段,包含详细注释,还有关键逻辑的说明:


核心代码

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipUtils {

    /**
     * 将压缩的byte[]解压缩为原始byte[]
     * 注:如果zip包包含多个文件,这里只会返回第一个文件的内容;如果需要处理多文件,可调整为返回Map<String, byte[]>
     * @param zipBytes 压缩后的byte数组
     * @return 解压缩后的原始byte数组
     * @throws IOException 处理过程中的IO异常
     */
    public static byte[] unzipBytes(byte[] zipBytes) throws IOException {
        // 用ByteArrayInputStream读取输入的zip字节数组
        try (ByteArrayInputStream bais = new ByteArrayInputStream(zipBytes);
             ZipInputStream zis = new ZipInputStream(bais);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {

            // 获取zip包中的第一个条目(如果是多文件,需要循环遍历zis.getNextEntry()直到null)
            ZipEntry entry = zis.getNextEntry();
            if (entry == null) {
                throw new IOException("输入的zip字节数组为空或无效");
            }

            // 跳过目录条目(如果有的话)
            if (!entry.isDirectory()) {
                byte[] buffer = new byte[1024];
                int len;
                // 读取解压缩后的内容到ByteArrayOutputStream
                while ((len = zis.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                // 转换为byte[]返回
                return baos.toByteArray();
            } else {
                throw new IOException("zip包中仅包含目录,没有可解压缩的文件内容");
            }
        }
    }

    // 测试用例
    public static void main(String[] args) throws IOException {
        // 假设这里有一个已压缩的byte数组(实际场景中你可以从网络、数据库等获取)
        byte[] zipBytes = ...; // 替换为你的zip byte[]

        try {
            byte[] unzippedBytes = unzipBytes(zipBytes);
            System.out.println("解压缩成功,原始数据长度:" + unzippedBytes.length);
            // 可以在这里对unzippedBytes进行后续处理,比如转成字符串、写入流等
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • 全程使用ByteArrayInputStream和ByteArrayOutputStream在内存中处理数据,完全不涉及磁盘文件操作
  • 如果你的zip包包含多个文件,可以把方法返回值改成Map<String, byte[]>,其中key是文件名,value是对应文件的解压缩字节数组,只需要循环调用zis.getNextEntry()直到返回null即可
  • 代码使用了try-with-resources语法,自动关闭流,避免资源泄漏
  • 加入了基本的异常处理,比如空zip包、仅含目录的情况

内容的提问来源于stack exchange,提问作者SomashekharRao Ramasingu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:44:37