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

Java 我可以使字节数组的大小成为动态的吗?,java,dynamic,arraylist,bytearray,fileoutputstream,Java,Dynamic,Arraylist,Bytearray,Fileoutputstream,我使用一个字节数组和OutputStream的write()方法将数据存储到一个文件中。 为此,我使用预定义的大小启动字节数组。但是我不希望它为每个InputStream占用这么多空间,因为它们的大小可能比数组的大小小得多。是否可以以某种方式使数组动态,以便它根据输入流的大小调整其大小? 我的代码中有类似的内容: byte[] b = new byte[20000]; int length; while ((length = in.read(b))!= -1)

我使用一个字节数组和
OutputStream
的write()方法将数据存储到一个文件中。 为此,我使用预定义的大小启动字节数组。但是我不希望它为每个
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();
这里,
中的
InputStream
对象,
op
FileOutputStream
对象。
我尝试过使用ArrayList,但是没有直接的方法将数据写入ArrayList,它只接受字节[]
,从代码的角度看,缓冲区的大小无关紧要。无论文件长度如何,8192的固定大小对于大多数目的都足够了。您的代码可以处理任何大于零的大小。

问题根本不在输出端,只是您不知道输入有多大

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

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


您可以将阵列的大小减小到(比如)4K或8K。您仍然能够处理任意大小的输入,因为您正在对其进行循环并将其分块复制。如果一次读取的缓冲区大小超过这个值,那么它就没有那么高效了。效率差异的程度将是非常上下文敏感的-只有您可以衡量代码在您的实际情况下的性能-或者性能在时间上的重要性,或者说,节省几千个字节是多么有用,不管怎样,这些字节之后都可以立即进行垃圾收集。

只需占用少量缓冲区即可。它起作用了

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

很久以前在这里被问到并得到了澄清:

为什么不
byte[]bytes=新字节[1024]我只是用它作为虚拟尺寸。实际上,我用它来保存网络上的图像。那么,1024就行了。但是,大多数图片都是肯定的,它是有效的。看看我发布的代码,我可以上传大于200MB的文件,而不需要那个小小的缓冲区!使用字节通道而不是字节数组效果很好!上面的代码使用一个小缓冲区
字节[]字节=新字节[1024]/
?正确的??我错过什么了吗?@sᴜʀᴇsʜᴀᴛᴛᴀ: 是的,这就是为什么我建议减少到4或8K。1K显然也会起作用。。。它只是另一个任意大小。成本在于效率,需要更多的读写操作。如果你认为1K比4K好,为什么不改为256字节呢?如果不对特定情况进行基准测试,我们就无法真正知道效率差异会是什么。是的,Jon,我还建议使用更小的尺寸,就是这样。明白了。我只是想知道是否有一种有效的方法可以做到这一点。为什么要浪费任何空间,不管它有多小。如果inputstream的大小超过了字节数组的大小怎么办?@BreakingBenjamin:正如我在回答中所写的:“你仍然能够处理任何大小的输入,因为你在它上面循环并将它分块复制。”我很惊讶你甚至会问——你期望这个循环是为了什么?如果您真的不想浪费一个字节的内存,只需调用
read()
的重载,它一次读取一个字节。这样您就没有分配数组的开销了。当然,这种开销几乎肯定是微不足道的,我认为您的优化不适当,但如果您根本不想浪费任何空间。。。