4

我正在使用带有 write() 方法的字节数组OutputStream将数据存储到文件中。为此,我使用预定义的大小启动字节数组。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();

这里,inInputStream对象,opFileOutputStream对象。我尝试过使用 ArrayLists,但没有FileOutputStream将数据写入 ArrayList 的直接方法,它只接受byte[].

4

3 回答 3

2

问题根本不在输出端——只是你不知道输入有多大。

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

请记住,这里的 20K 数组仅在您复制数据时才重要。之后,它可以被垃圾收集。您是否有任何迹象表明这实际上是一个问题?

可以将数组的大小减小到(例如)4K 或 8K。您仍然可以处理任何大小的输入,因为您正在循环它并以块的形式复制它。如果您可以一次读取超过该缓冲区大小的内容,那么它的效率就不会那么高了。这种效率差异的程度将是非常上下文相关的 - 只有您可以衡量该代码在您的实际情况下是否会执行 - 或者性能在时间方面的重要性,或者节省几千字节的有用性无论如何,这可以立即被垃圾收集。

于 2013-10-09T06:18:14.410 回答
0

只需少量缓冲。有用。

Long back 偶然发现了这种情况,下面的代码对我来说很好。

 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();

很久以前就在这里询问并得到澄清:缓冲区字节数组如何在流式传输时连续填充?

于 2013-10-09T06:25:13.523 回答
0

从代码的角度来看,缓冲区的大小并不重要。无论文件长度如何,8192 的固定大小足以满足大多数用途。您的代码适用于任何大于零的大小。

于 2013-10-09T06:18:06.737 回答