我可以使字节数组的大小动态吗?

时间:2013-10-09 06:13:30

标签: java dynamic arraylist bytearray fileoutputstream

我正在使用带有OutputStream的write()方法的字节数组来将数据存储到文件中。 为此,我正在使用预定义的大小启动字节数组。但是我不希望它为每个InputStream占用这么大的空间,而InputStream的大小可能远远低于数组的大小。是否有可能以某种方式使数组动态化,以便根据byte[] b = new byte[20000]; int length; while ((length = in.read(b))!= -1) { //writing it to a file op.write(b, 0, length); k++; } in.close(); op.close(); 的大小调整其大小? 我的代码中有这样的东西:

in

此处,InputStreamop对象,FileOutputStreamFileOutputStream对象。 我尝试过使用ArrayLists,但没有byte[]的直接方法将数据写入ArrayList,它只接受{{1}}。

3 个答案:

答案 0 :(得分:2)

问题根本不在输出方面 - 只是你不知道输入有多大。

不清楚InputStream来自哪里 - 例如,如果通过网络接收输入,您可能事先没有任何大小的指示。 InputStream本身没有任何简单的方法来检查流是否具有已知长度。

请记住,在复制数据时,此处的20K阵列仅 重要。之后,它可以被垃圾收集。你有迹象表明这实际上是一个问题吗?

可以将数组的大小减小到(例如)4K或8K。您仍然可以处理任何大小的输入,因为您循环并以块的形式复制它。在一次性读取超过缓冲区大小的情况下,它就不会完全高效。效率差异的程度将非常依赖于上下文 - 只有您可以衡量代码在实际情况下的表现 - 或者性能在时间方面的重要性,或者保存几千字节的有用程度无论如何,这可以在之后立即进行垃圾收集。

答案 1 :(得分:0)

从代码的角度来看,缓冲区的大小无关紧要。无论文件长度如何,固定大小8192对于大多数用途就足够了。您的代码可以使用任何大于零的大小。

答案 2 :(得分:0)

只需少量缓冲液即可。它有效。

长期以来,我遇到了这种情况,下面的代码对我来说很合适。

 byte[] b = new byte[1024]; //a little buffer
            int length;                 
            while ((length = in.read(b))!= -1) {
                //writing it to a file
                op.write(b, 0, length);
                k++;
            }

            in.close();
            op.close();

在这里问到并得到澄清:How the buffer byte array is continuously filling while streaming?