如何正确地将 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 对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MFC 正确地将 ICON 转换为 BITMAP?