我的数据库表中有一个blob列,我必须在我的Java程序中使用byte[]
作为映射,并使用这些数据我必须将其转换为InputStream
或{{ 1}}。但是当我这样做时,我不知道内部会发生什么。任何人都能简单地向我解释一下当我进行这种转换时会发生什么吗?
答案 0 :(得分:190)
您可以按如下方式创建和使用字节数组I / O流:
byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();
假设您使用的是实现标准JDBC Blob interface的JDBC驱动程序(并非所有操作),您可以 连接InputStream
或OutputStream
使用getBinaryStream
和setBinaryStream
方法 1 的blob,您也可以直接获取和设置字节。
(通常,您应该采取适当的步骤来处理任何异常,并关闭流。但是,在上面的示例中关闭bis
和bos
是不必要的,因为它们不与任何关联外部资源;例如文件描述符,套接字,数据库连接。)
1 - setBinaryStream
方法实际上是一个吸气剂。去图。
答案 1 :(得分:12)
我假设你的意思是'使用'意味着阅读,但我会为阅读案例解释的内容基本上可以与写案例相反。
所以你最终得到一个byte []。这可能代表任何类型的数据,可能需要特殊类型的转换(字符,加密等)。让我们假装您要将此数据原样写入文件。
首先你可以创建一个ByteArrayInputStream,它基本上是一个按顺序提供字节的机制。
然后您可以为要创建的文件创建FileOutputStream。对于不同的数据源和目的地,有许多类型的InputStreams和OutputStreams。
最后你会将InputStream写入OutputStream。在这种情况下,字节数组将按顺序发送到FileOutputStream进行写入。为此,我建议使用IOUtils
byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
并反过来
FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();
如果您使用上面的代码片段,则需要处理异常,我建议您在finally块中执行'closing'。
答案 2 :(得分:6)
we can convert byte[] array into input stream by using ByteArrayInputStream
String str = "Welcome to awesome Java World";
byte[] content = str.getBytes();
int size = content.length;
InputStream is = null;
byte[] b = new byte[size];
is = new ByteArrayInputStream(content);
For full example please check here http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html
答案 3 :(得分:4)
InputStream / OutputStream与它们使用的字节之间没有转换。它们是为二进制数据而制作的,只是按原样逐个读取(或写入)字节。
当您想要从byte转到char时,需要进行转换。然后你需要使用字符集进行转换。当您从字节创建String或Reader时会发生这种情况,这是为字符数据而生成的。
答案 4 :(得分:2)
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
答案 5 :(得分:0)
我确实意识到我对这个问题的回答迟到了,但我认为社区希望a newer approach to this issue。
答案 6 :(得分:0)
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
我认为这更好,因为你已经在响应对象中有一个现有的OutputStream。 无需创建新的OutputStream。