如何正确地将 Blob 对象转换为 ByteArrayInputStream 对象? [复制]

Posted

技术标签:

【中文标题】如何正确地将 Blob 对象转换为 ByteArrayInputStream 对象? [复制]【英文标题】:How to correctly convert a Blob object into a ByteArrayInputStream object? [duplicate] 【发布时间】:2015-04-24 16:30:00 【问题描述】:

我对如何将 Blob 对象(取自数据库并表示 PDF)转换为 ByteArrayInputStream 对象有一些疑问。

所以我知道我可以这样做:

ByteArrayOutputStream docPDF = null;
InputStream blobinstream = null;

Blob blob = rset.getBlob("PDF");    // I obtain it from a result set DB query

if(blob!=null) 
    blobinstream = blob.getBinaryStream();
    int chunk = 1024;
    byte[] buffer = new byte[chunk];
    int length = -1;

    docPDF = new ByteArrayOutputStream();

    while ((length = blobinstream.read(buffer)) != -1) 
        docPDF.write(buffer, 0, length);
    

    docPDF.flush();

所以在前面的代码 sn-p 中,我从数据库查询中获得了 Blob 对象,然后我读取了它并获得了 ByteArrayOutputStream docPDF

然后我做这样的事情来将我的 ByteArrayOutputStream docPDF 转换为 ByteArrayInputStream 对象:

ByteArrayInputStream currentPdfBAIS = new ByteArrayInputStream(docPDF.toByteArray());

所以我已经获得了我的 ByteArrayInputStream 对象。

它工作正常,但这是最好的方法吗?我可以不通过 ByteArrayOutputStream docPdf 对象而从 Blob 对象获取 ByteArrayInputStream 对象吗?还是之前提出的解决方案是正确的?

Tnx

【问题讨论】:

为什么需要一个 ByteArrayInputStream?是否希望 InputStream 保持在创建 blob 的事务之后?如果没有,只需使用 blob.getBinaryStream()。 这个问题的答案取决于 PDF 内容的最终目的地。通常,您永远不会将其加载到字节数组中,因为这不会很好地扩展。 @AdrianLeonhard 因为我使用 iText 创建 PDF(从 Blob 的内容到我的 DB 开始)并且 iText 使用 ByteArrayOutputStream 创建 PDF 如果它使用 ByteArrayOutputStream 创建 PDF,为什么要创建 ByteArrayInputStream?我建议您包含用于创建 pdf 的代码,因为这是您的实际问题。 【参考方案1】:

当您获得输入流时,您需要将其写入某些内容,因此您上面的示例是可以的。请记住,您正在将整个文件读入内存。如果这是想要的结果,那就没问题了。

为了简化我的代码,我使用了 Apache 的 IOUtils:

bos = new ByteArrayOutputStream();
IOUtils.copy(rs.getBlob(1).getBinaryStream(), bos);
bos.flush();
byte[] contentData = bos.toByteArray();

【讨论】:

以上是关于如何正确地将 Blob 对象转换为 ByteArrayInputStream 对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将特定对象列表转换为 Gson?

如何使用 MFC 正确地将 ICON 转换为 BITMAP?

如何正确地将 Figma 圆锥(又名径向)渐变转换为 android 矢量可绘制?

如何正确地将 blob 从前端传递到后端?

Javascript:正确地将日期字符串转换为日期对象

Unity JsonUtility 没有正确地将字符串转换为对象