如何获取字节数组中的元素数量?

时间:2015-08-23 08:41:08

标签: java arrays

众所周知,Java会在声明时分配数组的大小。意思是如果我像这样定义数组:

byte[] buffer = new byte[10];

buffer.length将返回10.但是,我的问题是,如何找出填充了多少元素。我正在填充InputStream中的元素,所以我永远不知道会有多少元素。

我知道已分配的数组位置为空0但如果我从InputStream得到零值,与正常值混合在一起会怎么样?

4 个答案:

答案 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。