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

时间:2014-02-12 14:59:48

标签: 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);   
}

不起作用。

但是如果你把字节数组放到while循环中就像

那样
int incomingDataLenght = 0;

while(true)  {     
    byte[] incomingData = new byte[1024];    
    incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}
一切都运转良好。我不明白的问题,当我声明一个字节数组时,实际上我正在声明指针。还有一个while循环之旅,我将指针指向read方法,它正在填充从我声明的指针开始的数组,我应该使用带有新数据的指针。但实际上这是行不通的。

有人可以解释为什么它不起作用吗?

修改

抱歉我的问题不明确。我正在从套接字读取媒体字节并在ConcurrentLinkedQueue<byte>内存储一段缓冲时间(即生产者)。然后我的消费者线程开始了。正如我在上面所讨论的那样,当我在while循环中移动我的数组初始化时,我的数据变得清晰,我的消费者线程可以成功处理我的数据。

我认为我的回答是我的问题的秘密。 Whenewer我将字节数组存储在队列中,我正在使用相同的指针(这是byte [] incomingData的指针)。当我开始从队列中读取时,我正在读取当前时间的数据而不是缓冲数据。

如果这个考虑是真的,那么这是每次循环初始化数组的最佳方法吗?

3 个答案:

答案 0 :(得分:0)

虽然您没有说明第一种方式究竟发生了什么,但这两个片段之间存在明显差异: 在第二个代码'incomingData'每个周期都被初始化!

答案 1 :(得分:0)

两个示例都无法使用

中的错误进行编译
incomingDataLenght =is.read(incomingData,0,incomingData.lenght);  

应该是

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

答案 2 :(得分:0)

您的问题无疑是在调用incomingLength方法后忽略read()。你在这个循环中做的其他事情应该只使用索引incomingData中的[0]来索引[incomingLength-1],,如果incomingLength < 0.

,循环也应该中断

更常规的写作方式是

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

您正在观察的不同行为是,在每次循环迭代时使用新缓冲区,您将获得尾随空值,而不是跟踪上一次迭代中遗留的垃圾。