字节[]到 InputStream 或 OutputStream

我的数据库表中有一个 blob 列,对于这个列,我必须在 Java 程序中使用 byte[]作为映射,为了使用这个数据,我必须将它转换为 InputStreamOutputStream。但我不知道当我这样做时,内部会发生什么。有人能简单地解释一下我做这个转换时发生了什么吗?

307020 次浏览

创建和使用字节数组 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 驱动程序(并非所有驱动程序都这样做) ,您可以使用 getBinaryStreamsetBinaryStream方法 1InputStreamOutputStream连接到一个 blob,还可以直接获取和设置字节。

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

1-setBinaryStream方法实际上是一个 getter 函数

在 InputStream/OutputStream 和它们使用的字节之间没有转换。它们是为二进制数据而生的,只是按原样逐个读(或写)字节。

当您想要从 byte 转换到 char 时,需要进行转换。然后需要使用字符集进行转换。当您根据字节生成 String 或 Reader 时会发生这种情况,这些字节是为字符数据生成的。

我假设您的意思是“使用”意味着读,但是我将要解释的 read 大小写的情况基本上可以反过来解释 write 大小写的情况。

所以最后得到的是一个字节[]。这可以表示需要特殊类型转换(字符、加密等)的任何类型的数据。让我们假设您希望将此数据写入文件。

首先,你可以创建一个 字节数组输入流,它基本上是一种按顺序提供字节的机制。

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

最后,将 InputStream 写入 OutputStream。在这种情况下,字节数组将按顺序发送到 FileOutputStream 进行写入。为此,我建议使用 白痴

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 块。

我知道我的回答对于这个问题来说已经太迟了,但是我认为社区会喜欢 解决这个问题的新方法

byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

我认为这样更好,因为在 response 对象中已经有一个现有的 OutputStream。 不需要创建新的 OutputStream。

我们可以使用 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

output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )