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

Java中比较两个Blob对象内容的方法及InputStream读取为空问题解决

Java中Blob与InputStream内容对比的问题解决

一、验证两个Blob对象的内容一致性

要确认重加密后的Blob数据是否和原Blob一致,直接读取两者的字节数组并对比即可:

Blob blob = new SerialBlob(cis.readAllBytes());
final Blob blob2 = test.reEncrypt(blob, "");

// 读取Blob的全部字节内容
byte[] originalBlobBytes = blob.getBytes(1, (int) blob.length());
byte[] reEncryptedBlobBytes = blob2.getBytes(1, (int) blob2.length());

// 对比字节数组判断内容是否一致
boolean contentMatch = Arrays.equals(originalBlobBytes, reEncryptedBlobBytes);

注意:Blob的getBytes方法起始索引为1(而非0),需传入1作为起始位置,长度传入Blob的总长度即可读取全部内容。

二、InputStream读取为空的问题排查及正确对比方式

问题根源

你的代码中,reEncrypt方法在执行时已经读取了cis输入流的全部内容,导致后续调用cis.readAllBytes()时,流指针已到末尾,返回空字节数组,最终得到空的Base64字符串。此外,InputStream本身是单向流,只能被读取一次,读取后无法重复获取内容。

正确实现方式

先复制原输入流的内容,避免原流被消费后无法读取:

// 先读取原始输入流的全部字节
byte[] originalData = is.readAllBytes();

// 基于复制的字节生成加密输入流,供重加密使用
final InputStream cis = test.getEncryptingInputStream(new ByteArrayInputStream(originalData));
// 再生成一份复制的流,用于后续内容对比
final InputStream cisCopy = new ByteArrayInputStream(originalData);

// 执行重加密得到结果流
final InputStream resStream = test.reEncrypt(cis, "");

// 读取两个流的内容并对比
byte[] cisContent = cisCopy.readAllBytes();
byte[] resContent = resStream.readAllBytes();
boolean contentMatch = Arrays.equals(cisContent, resContent);

// 如需可视化查看,再转Base64
String encodeStr1 = Base64.getEncoder().encodeToString(cisContent);
String encodeStr2 = Base64.getEncoder().encodeToString(resContent);

核心注意事项

  • 对于需要多次读取的输入流,建议先将内容转为byte[],再通过ByteArrayInputStream生成可重复读取的流实例。
  • 内容对比优先使用Arrays.equals(byte[], byte[]),比转Base64后对比字符串更高效准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:24:58