Java 字节[]到InputStream或OutputStream

Java 字节[]到InputStream或OutputStream,java,bytearray,inputstream,outputstream,Java,Bytearray,Inputstream,Outputstream,我的数据库表中有一个blob列,为此我必须在Java程序中使用byte[]作为映射,要使用此数据,我必须将其转换为InputStream或OutputStream。但我不知道当我这样做的时候,内部会发生什么。有人能简单地解释一下我进行此转换时发生了什么吗?您可以按如下方式创建和使用字节数组I/O流: byte[] source = ...; ByteArrayInputStream bis = new ByteArrayInputStream(source); // read bytes fro

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

您可以按如下方式创建和使用字节数组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驱动程序(并非所有JDBC驱动程序),您还可以使用
getBinaryStream
setBinaryStream
方法1将
InputStream
OutputStream
连接到blob,您还可以直接获取和设置字节

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


1.
setBinaryStream
方法确实是一个getter。如图所示。

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


当您想从字节转换为字符时,需要进行转换。然后需要使用字符集进行转换。当您从字节中生成字符串或读取器时,就会发生这种情况,字节是为字符数据而生成的。

我假设您的意思是“使用”意味着读取,但我将解释的读取情况基本上与写入情况相反

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

首先,您可以创建一个基本上是一种机制,用于按顺序向某些内容提供字节

然后可以为要创建的文件创建一个。对于不同的数据源和目的地,有许多类型的InputStreams和OutputStreams

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

反过来

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块中执行“closes”。

我确实意识到我回答这个问题的时间太晚了,但我想社区会喜欢的

我认为这样更好,因为响应对象中已经有一个现有的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);

有关完整示例,请检查此处

标题不应该是“字节数组…”或“字节数组…”或“字节[…]”而不是“数组字节…”吗?请参阅此处的相反内容:您的意思不是-ByteArrayOutputStream out=new ByteArrayOutputStream();而是ByteArrayOutputStream out=新的ByteArrayInputStream();closequity可能应该在finally子句中。循环缓冲区不能解决OP的问题。在所写的问题中,OP需要在单字节数组中包含全部内容。
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();
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);
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )