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

Java中如何将ByteBuffer转InputStream后还原原始对象列表

实现方案

核心思路

正向流程的核心链路为:List<objA> → GZIP压缩+UTF-8编码写入文件 → 读取文件字节封装为ByteBuffer,反向操作只要按链路逆序执行即可:

  • 第一步:从ByteBuffer中读取有效字节数组
  • 第二步:对字节数组做GZIP解压,按UTF-8编码解码为文本
  • 第三步:逐行读取文本,按分隔符切分字段后封装为objA对象,最终汇总为列表

完整实现代码

首先确认你原有代码中的常量SEPARATOR和objA类的结构和正向逻辑保持一致即可,代码如下:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.GZIPInputStream;

// 入参为你已生成的ByteBuffer对象
public List<objA> reverseByteBufferToObjList(ByteBuffer buff) throws Exception {
    List<objA> resultList = new ArrayList<>();
    // 1. 提取ByteBuffer中的有效字节,兼容堆外、有偏移的ByteBuffer场景
    byte[] byteArr;
    if (buff.hasArray()) {
        byte[] fullArr = buff.array();
        int offset = buff.arrayOffset() + buff.position();
        int length = buff.remaining();
        // 截取有效字节段
        byteArr = new byte[length];
        System.arraycopy(fullArr, offset, byteArr, 0, length);
    } else {
        // 堆外ByteBuffer场景读取字节
        byteArr = new byte[buff.remaining()];
        buff.get(byteArr);
    }

    // 2. 按正向逻辑逆序解压、解码
    try (ByteArrayInputStream bais = new ByteArrayInputStream(byteArr);
         GZIPInputStream gzipIn = new GZIPInputStream(bais);
         InputStreamReader reader = new InputStreamReader(gzipIn, StandardCharsets.UTF_8);
         BufferedReader br = new BufferedReader(reader)) {

        String line;
        // 3. 逐行解析封装为objA
        while ((line = br.readLine()) != null) {
            // 按正向的分隔符切分,-1参数避免末尾分隔符导致的字段丢失
            String[] fields = line.split(SEPARATOR, -1);
            objA obj = new objA();
            // 字段顺序和正向写入顺序保持一致
            obj.setProp1(fields[0]);
            obj.setProp2(fields[1]);
            resultList.add(obj);
        }
    }
    return resultList;
}

注意事项

  • 需保证代码中用到的SEPARATOR和你正向写入时的常量完全一致
  • 如果objA的属性不是String类型,切分字段后需要对应做类型转换,比如Integer.parseInt(fields[x])
  • 本段代码无第三方依赖,不需要额外引入工具包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:39:00