Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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中,从InputStream中获取大小未知的字节数组?_Java_Stream_Bytearray_Inputstream - Fatal编程技术网

在Java中,从InputStream中获取大小未知的字节数组?

在Java中,从InputStream中获取大小未知的字节数组?,java,stream,bytearray,inputstream,Java,Stream,Bytearray,Inputstream,我通过套接字发送一个字节数组,通过DataInputStream接收它。我不知道字节数组的大小,也没有办法检查。我试过这样做: byte[] content = new byte[ARRAY_SIZE]; int something; while((something = inFromStream.read()) > 0) output.write(something); 然而,这仍然意味着我需要知道字节数组的大小。我不想只填写一个巨大的数字(因为从流接收到的字节数组

我通过套接字发送一个字节数组,通过DataInputStream接收它。我不知道字节数组的大小,也没有办法检查。我试过这样做:

byte[] content = new byte[ARRAY_SIZE]; 
int something; 

while((something = inFromStream.read()) > 0)  
    output.write(something); 

然而,这仍然意味着我需要知道字节数组的大小。我不想只填写一个巨大的数字(因为从流接收到的字节数组可能是100,甚至可能是5000000000)。我如何处理这个问题(最好是使用标准JavaAPI/库)

您可以将
字节[]
逐段发送到
输出流

byte[] buffer = new byte[1024 /* or some other number */];
int numRead;

while((numRead = inputStream.read(buffer)) > 0) {
    outputStream.write(buffer, 0, numRead);
}

解决方法-仅使用逻辑而不使用代码示例

getSizeOfInput int countTokens(){

readInput tokenizeInput countTokens

返回countTokens}

创建一个大小为countTokens的数组

但总而言之,看看链接

为什么您仍然需要知道此处字节数组的大小?你想做什么?可能重复我刚才说的,我需要一种不需要知道通过流发送的字节数组大小的方法。我显然需要先初始化数组,然后才能实际使用它。有其他选择吗?您需要一个高效的
ArrayList
ByteArrayOutputStream
就是这样<代码>16384只是一个缓冲区。它不必那么大。是的,它会工作的。它将在每次循环迭代中复制多达16384个字节。您可以选择不同的缓冲区大小,这只会影响性能。将根据需要增长。将数据复制到具有精确大小的新数组中。在Java中,这是一种效率极低的处理字节的方法。即使所有
Byte
值都自动装箱到缓存的值(它们将是缓存的值),您仍然在使用数据中每个字节的引用大小。@user1007059。您根本不需要大小,因为您根本不需要内存中的所有数据。在写入任何内容之前将其全部读入内存只会浪费时间和空间,并且不能扩展到大的输入。使用1024作为缓冲区大小的原因是什么?@Trevor这是一个任意数字。如果缓冲区大小不同,程序的性能可能会更好