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
相关产品推荐
相关产品推荐

