将Byte[]转换为InputStream或OutputStream

138

我在数据库表中有一个blob列,在Java程序中必须使用byte[]进行映射,使用该数据时必须将其转换为InputStreamOutputStream。但是,当我执行此转换时,内部会发生什么我不清楚。是否有人能简要解释一下这个转换的过程?


2
标题不应该是“字节数组…”或“字节数组…”或“byte[]…”,而不是“byte of array…”吗? - kuester2000
1
在此处查看反向链接:https://dev59.com/qHM_5IYBdhLWcg3wslfs - Jay Taylor
8个回答

208

您可以按如下方式创建和使用字节数组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方法将InputStreamOutputStream连接到Blob中1,并且您还可以直接获取和设置字节。

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

1 - setBinaryStream方法实际上是一个getter。想象一下。


14
我假设你的意思是'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

5

4

InputStream/OutputStream与它们所处理的字节之间没有转换。它们是用于二进制数据的,只是按原样逐个读取(或写入)字节。

当你想从字节转换为字符时,需要进行转换。然后你需要使用字符集进行转换。这发生在从字节创建String或Reader时,它们是用于字符数据的。


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

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

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


0

循环缓冲区无法解决提问者的问题。在所述问题中,提问者需要将整个内容存储在单个字节数组中。 - Stephen C

0
String info = "somedata";       
OutputStream os=new FileOutputStream("mydata.bin");
        byte [] datas= info.getBytes();
        os.write(datas);
    
InputStream is=new FileInputStream("mydata.bin");

        datas=new byte[1000];
        int counts = is.read(datas); //reads all data from bin to datas then returns size

        info = new String(datas,0,counts); //
        is.close();;


        System.out.println("From Binary File: " + info);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接