众所周知,Java会在声明时分配数组的大小。意思是如果我像这样定义数组:
byte[] buffer = new byte[10];
buffer.length
将返回10.但是,我的问题是,如何找出填充了多少元素。我正在填充InputStream
中的元素,所以我永远不知道会有多少元素。
我知道已分配的数组位置为空0
但如果我从InputStream
得到零值,与正常值混合在一起会怎么样?
答案 0 :(得分:2)
你不能。只需存储您在变量中读取的字节数。 InputStream.read()
返回读取的字节数:
返回:
读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则为-1。
答案 1 :(得分:1)
您可以使用InputStream
预计不会生成的某些无效值预先填充数组。但是,这取决于InputStream
的内容,因此选择通用默认值并不容易。
另一个选择是使用某些集合,例如List<Byte>
或Set<Byte>
(如果您需要唯一性) - 在这种情况下,填充元素的数量将只是集合的大小,如果你最后需要一个数组,你可以很容易地从集合的内容中生成一个数组。
答案 2 :(得分:1)
让我们看看这段代码:
InputStream inputStream = new FileInputStream(new File("fileName"));
int cntReadBytes = 0;
byte[] bytes = new byte[10];
while((i = inputStream.read()) != -1) {
bytes[cntReadBytes] = i;
cntReadBytes++;
}
System.out.println("You have read total: " + cntReadBytes + " bytes" );
你可以在while循环条件中看到我对输入流返回和-1
进行比较,当返回值不同时,意味着我有更多数据要读取,当它到达文件末尾时它将返回-1
。因此cntReadBytes
的值将是迭代次数,即成功读取字节。
或者如果你可以自由使用List,你不必担心这个。
答案 3 :(得分:0)
您可以计算通过InputStream传递的字节数,例如使用Apache Commons CountingInputStream。或者你可以自己扩展FilterInputStream,如果你没有Apache Commons。