我的数据库表中有一个 blob 列,我必须byte[]
在我的 Java 程序中将其用作映射,并且要使用此数据,我必须将其转换为InputStream
or OutputStream
。但我不知道当我这样做时内部会发生什么。谁能简要解释一下我进行此转换时发生了什么?
7 回答
您可以按如下方式创建和使用字节数组 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 接口的 JDBC 驱动程序(并非全部都这样做),您还可以使用and方法1将 aInputStream
或连接OutputStream
到 blob ,您还可以直接获取和设置字节。getBinaryStream
setBinaryStream
(通常,您应该采取适当的步骤来处理任何异常,并关闭流。但是,在上面的示例中关闭bis
和bos
是不必要的,因为它们与任何外部资源无关;例如文件描述符、套接字、数据库连接。)
1 - 该setBinaryStream
方法确实是一个吸气剂。去搞清楚。
我假设您的意思是“使用”意味着读取,但是我将针对读取情况解释的内容对于写入情况基本上可以颠倒过来。
所以你最终得到一个字节[]。这可以表示可能需要特殊类型转换(字符、加密等)的任何类型的数据。假设您想将这些数据按原样写入文件。
首先,您可以创建一个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 块中执行“关闭”。
我们可以使用 ByteArrayInputStream 将 byte[] 数组转换为输入流
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);
有关完整示例,请在此处查看http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html
InputStream/OutputStream 和它们正在使用的字节之间没有转换。它们是为二进制数据制作的,只是按原样逐个读取(或写入)字节。
当您想从字节转换为字符时,需要进行转换。然后您需要使用字符集进行转换。当您从用于字符数据的字节中创建 String 或 Reader 时,就会发生这种情况。
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
我认为这更好,因为您已经在响应对象中有一个现有的 OutputStream。无需创建新的 OutputStream。
我确实意识到我对这个问题的回答已经晚了,但我认为社区希望对这个问题采取更新的方法。