我想问一个简单的问题。让我们考虑一下这个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);
}一切都很顺利。我不明白的问题,当我声明一个字节数组时,实际上我是在声明指针。在with循环中,我给这个指针一个读方法,它填充了我的数组,这个数组从我声明的指针开始,我应该用新的数据来使用这个指针,但在现实中,这是行不通的。
有人能解释一下为什么它不起作用吗?
编辑
很抱歉我的问题不清楚。我从套接字中读取媒体字节,并在ConcurrentLinkedQueue<byte>中存储一些缓冲时间(即生产者)。然后我的消费者线开始了。在上面,当我在while循环中移动数组初始化时,我的数据是清晰的,我的使用者线程可以成功地处理我的数据。
我想我的答案对我的问题是保密的。当我在队列中存储字节数组时,我使用相同的指针(即byte[] incomingData的指针)。当我开始从队列读取数据时,我读取的是当前时间的数据,而不是缓冲的数据。
如果这个考虑是正确的,那么这是每隔一次初始化数组的最佳方法吗?
发布于 2014-02-12 15:05:47
虽然您没有说第一种方法到底发生了什么,但是这两个代码段之间有一个明显的区别:在第二个代码中,'incomingData‘每一个周期都会被初始化!
发布于 2014-02-12 15:09:40
两个示例都不会使用错误进行编译
incomingDataLenght =is.read(incomingData,0,incomingData.lenght); 应该是
incomingDataLenght =is.read(incomingData,0,incomingData.length);发布于 2014-02-13 23:30:55
毫无疑问,您的问题是在调用incomingLength方法之后忽略了read()。无论您在这个循环中做什么,都应该只使用incomingData (从索引[0]到索引[incomingLength-1], ),如果incomingLength < 0.,则循环也应该中断。
一种更传统的书写方式是
while ((incomingLength = is.read(incomingData)) > 0)
{
// ...
}您所观察到的不同行为是,使用一个新的缓冲区,每一个循环迭代都会跟踪空值,而不是跟踪上次迭代遗留的垃圾。
https://stackoverflow.com/questions/21731463
复制相似问题