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

时间:2015-11-23 06:37:54

标签: java byte bytearrayinputstream

据我所知,class QuestionNode { QuesionNode(){} //Empty default constructor for deserializer public String Value { get; set; } public int? QId { get; set; } //More properties.... } 用于阅读ByteArrayInputStream数据。 我为什么要使用它而不是简单的byte[](例如从DB中读取它)。

他们之间有什么不同?

3 个答案:

答案 0 :(得分:6)

如果输入总是一个byte[],那么你是对的,通常不需要流。并且if you don't need it, don't use it。 ByteArrayInputStream的另一个优点是它可以非常强烈地表明您希望字节是只读的(因为流不提供用于更改它们的接口),尽管它对于请注意,程序员 通常仍然可以直接访问字节,所以在安全性问题的情况下你不应该使用它。

但是,如果它有时是byte[],有时是文件,有时是网络连接等,那么你需要某种抽象来实现"一个字节流,我不要&# 39;关心他们来自何处。"这就是InputStream的含义。当源恰好是一个字节数组时,ByteArrayInputStream是一个很好用的InputStream。

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

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

答案 1 :(得分:4)

  • ByteArrayInputStream包含一个包含字节的内部缓冲区 可以从流中读取。 内部计数器会跟踪read方法提供的下一个字节。
  • ByteArrayInputStream类似于保护底层数组免受外部修改的包装器
  • 具有高阶读取,标记,跳过功能
  • 流还具有以下优点:您不必同时在内存中包含所有字节,这在数据大小很大且可以轻松处理的情况下很方便。< / p>

    Reference doc

  • 如果您选择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));
        }
    

答案 2 :(得分:0)

ByteArrayInputStream是byte []的很好的包装器,核心是理解流,流是不确定长度的有序字节序列。输入流将数据字节移到 java程序来自一些通常来自外部的源代码,在java io中,您可以将一个流装饰到另一个流以获取更多功能。但是性能可能不好。流隐喻的强大之处在于,这些源和目标之间的差异是抽象化的,使用相同的类和方法将所有输入和输出操作简单地转换为流,而不必为每种不同的设备学习新的API ,读取文件的同一API可以读取网络套接字,串行端口,蓝牙传输等。