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

2022-09-03 06:43:24

据我所知,它用于读取数据。为什么我应该使用它而不是简单(例如从DB中读取它)。ByteArrayInputStreambyte[]byte[]

它们之间有什么区别?


答案 1

如果输入始终是 ,则你是对的,通常不需要流。如果你不需要它,就不要使用它。ByteArrayInputStream的另一个优点是,它作为一个非常强烈的指示,表明你打算将字节是只读的(因为流不提供用于更改它们的接口),尽管重要的是要注意程序员通常仍然可以直接访问字节,所以你不应该在安全是一个问题的情况下使用它。byte[]

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

这在很多情况下都很有用,但要给出两个具体的例子:

  • 您正在编写一个获取字节并以某种方式处理它们的库(例如,它可能是一个图像处理库)。库的用户可能会从文件、内存中的 a 或其他源提供字节。因此,您提供了一个接受 — 的接口,这意味着如果他们拥有的是 ,他们需要将其包装在 ByteArrayInputStream 中。byte[]InputStreambyte[]
  • 您正在编写读取网络连接的代码。但是要对该代码进行单元测试,您不希望必须打开连接;您只想在代码中提供一些字节。因此,代码采用 InputStream,而您的测试则提供 ByteArrayInputStream。

答案 2
  • 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));
        }