[英]Why to use ByteArrayInputStream rather than byte[] in Java
据我了解ByteArrayInputStream
用于读取byte[]
数据。 为什么我应该使用它而不是简单的byte[]
(例如从 DB 读取它)。
它们之间有什么不同?
如果输入始终是byte[]
,那么您是对的,通常不需要流。 如果您不需要它,请不要使用它。 ByteArrayInputStream 的另一个优点是它可以非常有力地表明您希望字节是只读的(因为流不提供用于更改它们的接口),尽管重要的是要注意程序员经常可以仍然直接访问字节,因此您不应该在安全性受到关注的情况下使用它。
但是,如果它有时是byte[]
,有时是文件,有时是网络连接等,那么您需要对“字节流进行某种抽象,我不在乎它们来自哪里”。 这就是 InputStream 的含义。 当源恰好是一个字节数组时,ByteArrayInputStream 是一个很好的 InputStream 使用。
这在很多情况下都有帮助,但举两个具体的例子:
byte[]
或其他来源提供byte[]
。 因此,您提供了一个接受InputStream
的接口——这意味着如果他们拥有的是byte[]
,他们需要将其包装在 ByteArrayInputStream 中。流还有一个优点,您不必同时将所有字节都放在内存中,这在数据量很大并且可以轻松地以小块处理时很方便。
如果您选择byte[]
,那么您必须生成轮子来明确地进行读取、跳过和跟踪当前索引
byte data[] = { 65, 66, 67, 68, 69 }; // data for (int index = 0; index < data.length; index++) { System.out.print((char) data[index] + " "); } int c = 0; ByteArrayInputStream bInput = new ByteArrayInputStream(data); while ((bInput.read()) != -1) { System.out.println(Character.toUpperCase((char) c)); }
ByteArrayInputStream 是 byte[] 的一个很好的包装器,核心是理解流,流是不确定长度的有序字节序列。输入流将字节数据从一些通常的外部源移动到 java 程序中,在 java io 中,您可以将一个流装饰到另一个流以获得更多功能。 但性能可能很差。 流隐喻的强大之处在于这些源和目的地之间的差异是抽象的方式,所有输入和输出操作都使用相同的类和相同的方法简单地作为流进行交易,您不必为每种不同类型的设备学习新的 API ,读取文件的相同API可以读取网络套接字、串口、蓝牙传输等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.