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

