首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么(真){ inputStream.read(incomingData) }不能工作?

为什么(真){ inputStream.read(incomingData) }不能工作?
EN

Stack Overflow用户
提问于 2014-02-12 14:59:48
回答 3查看 1.1K关注 0票数 0

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

代码语言:javascript
运行
复制
InputStream is = socket.getInputStream(); 

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

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

不管用。

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

代码语言:javascript
运行
复制
int incomingDataLenght = 0;

while(true)  {     
    byte[] incomingData = new byte[1024];    
    incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}

一切都很顺利。我不明白的问题,当我声明一个字节数组时,实际上我是在声明指针。在with循环中,我给这个指针一个读方法,它填充了我的数组,这个数组从我声明的指针开始,我应该用新的数据来使用这个指针,但在现实中,这是行不通的。

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

编辑

很抱歉我的问题不清楚。我从套接字中读取媒体字节,并在ConcurrentLinkedQueue<byte>中存储一些缓冲时间(即生产者)。然后我的消费者线开始了。在上面,当我在while循环中移动数组初始化时,我的数据是清晰的,我的使用者线程可以成功地处理我的数据。

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

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

EN

回答 3

Stack Overflow用户

发布于 2014-02-12 15:05:47

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-12 15:09:40

两个示例都不会使用错误进行编译

代码语言:javascript
运行
复制
incomingDataLenght =is.read(incomingData,0,incomingData.lenght);  

应该是

代码语言:javascript
运行
复制
incomingDataLenght =is.read(incomingData,0,incomingData.length);
票数 0
EN

Stack Overflow用户

发布于 2014-02-13 23:30:55

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

一种更传统的书写方式是

代码语言:javascript
运行
复制
while ((incomingLength = is.read(incomingData)) > 0)
{
    // ...
}

您所观察到的不同行为是,使用一个新的缓冲区,每一个循环迭代都会跟踪空值,而不是跟踪上次迭代遗留的垃圾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21731463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档