Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ByteArray/ByteBuffer中使用“写入数据输出流”;“动态”;尺寸?_Java_Android_Bytearray_Bytebuffer_Dataoutputstream - Fatal编程技术网

Java 在ByteArray/ByteBuffer中使用“写入数据输出流”;“动态”;尺寸?

Java 在ByteArray/ByteBuffer中使用“写入数据输出流”;“动态”;尺寸?,java,android,bytearray,bytebuffer,dataoutputstream,Java,Android,Bytearray,Bytebuffer,Dataoutputstream,我问自己,是否有一个很好的解决方案,可以通过TCP接收数据,读取DataInputStream中的数据,并将数据存储在“动态”大小的字节数组中。我考虑了一些解决方案,比如在缓冲区中写入数据,并最终将其存储在一个创建的数组中,该数组与我收到的数据包一样大 这里有一个例子:我通过TCP(逐字节)接收的数据是n*13字节大,数据包的结尾是13字节的零(13字节的零是唯一的,以前不能在数据中)。下一个数据包是m*13字节+13字节的零,以此类推。因此,我想要监听流,并将例如n*13字节存储在一个不带零的

我问自己,是否有一个很好的解决方案,可以通过TCP接收数据,读取DataInputStream中的数据,并将数据存储在“动态”大小的字节数组中。我考虑了一些解决方案,比如在缓冲区中写入数据,并最终将其存储在一个创建的数组中,该数组与我收到的数据包一样大

这里有一个例子:我通过TCP(逐字节)接收的数据是n*13字节大,数据包的结尾是13字节的零(13字节的零是唯一的,以前不能在数据中)。下一个数据包是m*13字节+13字节的零,以此类推。因此,我想要监听流,并将例如n*13字节存储在一个不带零的字节数组中(我以前不知道一个数据集的大小)

你能告诉我怎么做吗

提前谢谢


克里斯

我会直接把数据读入一个ByteBuffer。您也不需要DataInputStream。我会让ByteBuffer大于所需大小,例如1 MB或10 MB,并使用未使用的直接缓冲区(如未使用的本机内存)只使用虚拟内存,而不是实际内存这一事实。我会确保尽可能多地重复使用这个缓冲区,最好是在应用程序的生命周期中

在64位环境中,可以使缓冲区非常大。e、 g.1GB,没有太大影响


如果您希望最大限度地减少内存消耗,我会在您接收数据时对其进行处理。这样你就不必先储存它了。听起来最小大小是13个字节,可以产生一个合理的缓冲区大小,比如512字节或2 KB。

谢谢你的回答,但是“接收时处理数据”是什么意思?我想将ByteArray存储在一个hashmap中,因此无论如何都会占用内存。到目前为止,最好的解决方案是超大缓冲区?我使用了超大缓冲区,效果非常好。将很快添加代码。只需确保这些缓冲区被回收,而不是让GC回收它们。让GC循环使用缓冲区可能会导致使用其他页面,这些页面可以正常工作,但效率不高。