繁体   English   中英

为什么在 Java 中使用 ByteArrayInputStream 而不是 byte[]

[英]Why to use ByteArrayInputStream rather than byte[] in Java

据我了解ByteArrayInputStream用于读取byte[]数据。 为什么我应该使用它而不是简单的byte[] (例如从 DB 读取它)。

它们之间有什么不同?

如果输入始终byte[] ,那么您是对的,通常不需要流。 如果您不需要它,请不要使用它 ByteArrayInputStream 的另一个优点是它可以非常有力地表明您希望字节是只读的(因为流不提供用于更改它们的接口),尽管重要的是要注意程序员经常可以仍然直接访问字节,因此您不应该在安全性受到关注的情况下使用它。

但是,如果它有时是byte[] ,有时是文件,有时是网络连接等,那么您需要对“字节流进行某种抽象,我不在乎它们来自哪里”。 这就是 InputStream 的含义。 当源恰好是一个字节数组时,ByteArrayInputStream 是一个很好的 InputStream 使用。

这在很多情况下都有帮助,但举两个具体的例子:

  • 您正在编写一个接受字节并以某种方式处理它们的库(例如,它可能是一个图像处理库)。 您的库的用户可以从文件、内存中的byte[]或其他来源提供byte[] 因此,您提供了一个接受InputStream的接口——这意味着如果他们拥有的是byte[] ,他们需要将其包装在 ByteArrayInputStream 中。
  • 您正在编写读取网络连接的代码。 但是要对该代码进行单元测试,您不需要打开连接; 您只想在代码中提供一些字节。 因此,代码采用 InputStream,而您的测试提供了 ByteArrayInputStream。
  • ByteArrayInputStream 包含一个内部缓冲区,其中包含可以从流中读取的字节。 内部计数器跟踪读取方法提供的下一个字节。
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM