【发布时间】:2014-02-12 14:59:48
【问题描述】:
我想问一个简单的问题。让我们考虑一下这个伪代码:
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 循环中移动我的数组初始化时,我的数据开始变得清晰,我的消费者线程可以成功处理我的数据。
我认为我的答案是我的问题的秘密。当我在队列中存储字节数组时,我正在查找相同的指针(即 byte[] incomingData 的指针)。当我开始从队列中读取时,我正在读取当前时间的数据而不是缓冲数据。
如果这种考虑是正确的,那么这是在每个 while 循环中初始化数组的最佳方法吗?
【问题讨论】:
-
运行第一个代码时会发生什么?不工作并不是对您所面临问题的描述。
-
你为什么说它不起作用。请提供堆栈跟踪
-
第二个循环只会在你抛出 EOFException 时中断。第一个循环永远不会抛出 EOFException,而是永远旋转。
-
@PeterLawrey 你能解释一下为什么吗?您的断言似乎没有任何明显的理由 - 唯一的变体似乎是
incomingData是否在循环内重新声明。 -
@Fildor 这样的拼写错误的问题是它们不应该发生 - 显示问题的代码应该直接复制粘贴,这样您就可以确定问题存在于真实代码而不是此处转录的内容。
标签: java while-loop java-io