Byte []到InputStream或OutputStream

时间:2010-01-19 06:03:32

标签: java bytearray inputstream outputstream

我的数据库表中有一个blob列,我必须在我的Java程序中使用byte[]作为映射,并使用这些数据我必须将其转换为InputStream或{{ 1}}。但是当我这样做时,我不知道内部会发生什么。任何人都能简单地向我解释一下当我进行这种转换时会发生什么吗?

7 个答案:

答案 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驱动程序(并非所有操作),您可以 连接InputStreamOutputStream使用getBinaryStreamsetBinaryStream方法 1 的blob,您也可以直接获取和设置字节。

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

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。