我想问一个简单的问题。让我们考虑一下这个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的指针)。当我开始从队列中读取时,我正在读取当前时间的数据而不是缓冲数据。
如果这个考虑是真的,那么这是每次循环初始化数组的最佳方法吗?
答案 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)
{
// ...
}
您正在观察的不同行为是,在每次循环迭代时使用新缓冲区,您将获得尾随空值,而不是跟踪上一次迭代中遗留的垃圾。