inputstream或输出stream的Byte
我的数据库表中有一个blob列,为此我必须在我的Java程序中使用byte[]
作为映射,并使用这些数据,我必须将其转换为InputStream
或OutputStream
。 但是当我这样做的时候,我不知道内部会发生什么。 任何人都可以简单地向我解释当我做这个转换时发生了什么?
您可以按如下方式创build和使用字节数组I / Ostream:
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驱动程序(不是全部),还可以使用getBinaryStream
和setBinaryStream
方法将InputStream
或OutputStream
连接到blob 1 ,也可以直接获取和设置字节。
(一般来说,你应该采取适当的步骤来处理任何exception,并closuresstream,但是,在上面的例子中closuresbis
和bos
是不必要的,因为它们不与任何外部资源相关联;例如文件描述符,套接字,数据库连接。)
1 – setBinaryStream
方法实际上是一个getter。 去搞清楚。
我假设你的意思是“使用”是指读取,但是我将为读取案例解释的情况可以基本上与写入案例相反。
所以你最终得到一个字节[]。 这可能代表任何types的数据,可能需要特殊types的转换(字符,encryption等)。 让我们假装你想把这个数据原样写入一个文件。
首先你可以创build一个ByteArrayInputStream ,它基本上是一个按顺序将字节提供给某个东西的机制。
那么你可以为你想创build的文件创build一个FileOutputStream 。 对于不同的数据源和目标,有很多types的InputStream和OutputStreams。
最后你将InputStream写入OutputStream。 在这种情况下,字节数组将依次发送到FileOutputStream进行写入。 为此,我build议使用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();
如果您使用上面的代码片段,则需要处理exception,我build议您在finally块中执行“closures”。
InputStream / OutputStream和它们正在处理的字节之间没有转换。 它们是用于二进制数据的,只是逐个读取(或写入)字节。
当你想从字节到字符时,转换需要发生。 那么你需要使用字符集进行转换。 当您从字符中为字符数据创buildstring或读取器时,会发生这种情况。
我们可以通过使用ByteArrayInputStream将byte []数组转换为inputstream
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() )
我意识到我的回答对于这个问题来说太晚了,但是我认为社区会想要一个更新的方法来解决这个问题 。
byte[] data = dbEntity.getBlobData(); response.getOutputStream().write();
我认为这是更好的,因为你已经在响应对象中有一个现有的OutputStream。 不需要创build一个新的OutputStream。