Java-为什么while(true){inputStream.read(incomingData)}不起作用?

Java-为什么while(true){inputStream.read(incomingData)}不起作用?,java,while-loop,java-io,Java,While Loop,Java Io,我想问一个简单的问题。让我们来考虑这个PSUDO代码: InputStream is = socket.getInputStream(); byte[] incomingData = new byte[1024]; int incomingDataLenght = 0; while(true) { incomingDataLenght =is.read(incomingData,0,incomingData.length); } 不起作用 但如果将字节

我想问一个简单的问题。让我们来考虑这个PSUDO代码:

InputStream is = socket.getInputStream(); 

byte[] incomingData = new byte[1024];   
int incomingDataLenght = 0;

while(true)  {        
   incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}
不起作用

但如果将字节数组放入while循环中

int incomingDataLenght = 0;

while(true)  {     
    byte[] incomingData = new byte[1024];    
    incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}
一切都很顺利。我不明白的问题是,当我声明一个字节数组时,实际上我是在声明指针。在while循环中,我给了read方法指针,它填充了从我声明的指针开始的数组,我应该用新的数据来使用这个指针。但在现实中,这是行不通的

有人能解释一下为什么它不起作用吗

编辑 对不起,我的问题不清楚。我正在从套接字读取媒体字节,并在
ConcurrentLinkedQueue
中存储一段缓冲时间(即producer)。然后我的消费者线程开始了。正如我在上面提到的,当我在while循环中移动我的数组初始值时,我的数据被清除了,我的消费者线程可以成功地处理我的数据

我想我的答案对我的问题是保密的。当我在队列中存储字节数组时,我使用的是同一个指针(即字节[]incomingData的指针)。当我开始从队列中读取数据时,我读取的是当前时间的数据,而不是缓冲数据


如果这个考虑是正确的,那么这是每一个while周期初始化数组的最佳方法吗

虽然您没有说第一种方法到底发生了什么,但这两个片段之间有一个明显的区别:
在第二个代码中,“incomingData”每个周期都会初始化

两个示例在编译时都不会出现以下错误:

incomingDataLenght =is.read(incomingData,0,incomingData.lenght);  
应该是

incomingDataLenght =is.read(incomingData,0,incomingData.length);

您的问题无疑是在调用
read()
方法后忽略了
incomingLength
。无论您在这个循环中做什么,都应该只使用索引
[0]
中的
incomingData
来索引
[incomingLength-1],
,如果
incomingLength<0,循环也应该中断。

一种更为传统的书写方式是

while ((incomingLength = is.read(incomingData)) > 0)
{
    // ...
}

您所观察到的不同行为是,每次循环迭代使用新缓冲区时,您都会得到尾随的空值,而不是前一次迭代留下的尾随垃圾。

运行第一个代码时会发生什么?不工作不是你所面临问题的描述。你为什么说它不工作。请提供StackTrace只有在抛出EOFEException时,第二个循环才会中断。第一个循环永远不会抛出EOFEException,它将永远旋转。@PeterLawrey你能解释一下为什么吗?您的断言似乎没有任何明显的理由-唯一的变体似乎是
incomingData
是否在循环中重新声明了。@Fildor此类键入错误的问题是不应该发生-显示问题的代码应该直接复制粘贴,因此,您可以确定问题存在于真实代码中,而不是此处转录的任何内容。这是一个明显的区别,但从表面上看,它并不能解释行为。