据我所知,class QuestionNode
{
QuesionNode(){} //Empty default constructor for deserializer
public String Value { get; set; }
public int? QId { get; set; }
//More properties....
}
用于阅读ByteArrayInputStream
数据。
我为什么要使用它而不是简单的byte[]
(例如从DB中读取它)。
他们之间有什么不同?
答案 0 :(得分:6)
如果输入总是一个byte[]
,那么你是对的,通常不需要流。并且if you don't need it, don't use it。 ByteArrayInputStream的另一个优点是它可以非常强烈地表明您希望字节是只读的(因为流不提供用于更改它们的接口),尽管它对于请注意,程序员 通常仍然可以直接访问字节,所以在安全性问题的情况下你不应该使用它。
但是,如果它有时是byte[]
,有时是文件,有时是网络连接等,那么你需要某种抽象来实现"一个字节流,我不要&# 39;关心他们来自何处。"这就是InputStream的含义。当源恰好是一个字节数组时,ByteArrayInputStream是一个很好用的InputStream。
这在很多情况下很有用,但举两个具体的例子:
byte[]
或其他来源提供字节。因此,您提供了一个接受InputStream
的接口 - 这意味着如果它们具有byte[]
,则需要将它包装在ByteArrayInputStream中。答案 1 :(得分:4)
流还具有以下优点:您不必同时在内存中包含所有字节,这在数据大小很大且可以轻松处理的情况下很方便。< / p>
如果您选择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可以读取网络套接字,串行端口,蓝牙传输等。