我正在使用带有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
此处,InputStream
是op
对象,FileOutputStream
是FileOutputStream
对象。
我尝试过使用ArrayLists,但没有byte[]
的直接方法将数据写入ArrayList,它只接受{{1}}。
答案 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?