Byte []到InputStream或OutputStream


129

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


2
标题不应该是“字节数组...”或“字节数组...”或“字节[] ...”而不是“字节数组...”的标题吗?
kuester2000

Answers:


198

您可以按以下方式创建和使用字节数组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驱动程序(并非全部这样做),则可以使用和方法1将a InputStream或连接OutputStream到blob ,并且还可以直接获取和设置字节。getBinaryStreamsetBinaryStream

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

1-该setBinaryStream方法实际上是一种吸气剂。去搞清楚。


13

我假设您的意思是'use'表示读取,但是我将为读取情况解释的内容基本上可以与写入情况相反。

所以你最后得到一个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块中执行“关闭”操作。


您的意思不是-ByteArrayOutputStream out = new ByteArrayOutputStream(); 而是ByteArrayOutputStream out = new ByteArrayInputStream();
Avihai Marchiano

CloseQuietly可能应该在finally子句中。
JustinKSU 2014年


4

InputStream / OutputStream和它们使用的字节之间没有转换。它们是为二进制数据制作的,仅按原样一个字节读取(或写入)字节。

当您想从字节转换为字符时,需要进行转换。然后,您需要使用字符集进行转换。当您从为字符数据创建的字节中创建String或Reader时,会发生这种情况。


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


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

我认为这样做会更好,因为您在响应对象中已经有一个OutputStream了。无需创建新的OutputStream。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.