字节[] 到输入流或输出流

2022-08-31 08:16:17

我的数据库表中有一个blob列,为此,我必须在我的Java程序中将其用作映射,并且要使用此数据,我必须将其转换为或。但我不知道当我这样做时,内部会发生什么。任何人都可以简要解释一下我进行此转换时发生了什么吗?byte[]InputStreamOutputStream


答案 1

您可以按如下方式创建和使用字节数组 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 将 或 连接到 blob,还可以直接获取和设置字节。InputStreamOutputStreamgetBinaryStreamsetBinaryStream

(通常,应采取适当的步骤来处理任何异常并关闭流。但是,在上面的示例中,关闭和是不必要的,因为它们不与任何外部资源相关联;例如,文件描述符,套接字,数据库连接。bisbos

1 - setBinaryStream 方法实际上是一个 getter。去图。


答案 2

我假设你的意思是“使用”意味着阅读,但是我将为阅读情况解释的内容基本上可以反转为写入情况。

所以你最终会得到一个字节[]。这可以表示可能需要特殊类型转换(字符,加密等)的任何类型的数据。让我们假设您要按原样将此数据写入文件。

首先,您可以创建一个ByteArrayInputStream,它基本上是一种按顺序向某些东西提供字节的机制。

然后,您可以为要创建的文件创建一个FileOutputStream。对于不同的数据源和目标,有许多类型的输入流和输出流。

最后,您将输入流写入输出流。在这种情况下,字节数组将按顺序发送到 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();

如果您使用上述代码片段,则需要处理异常,我建议您在最终块中执行“关闭”。


推荐