【问题标题】:Java - Why while(true){ inputStream.read(incomingData) } does not work?Java - 为什么 while(true){ inputStream.read(incomingData) } 不起作用?
【发布时间】: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


【解决方案1】:

虽然你没有说第一种方式到底发生了什么,但是这两个 sn-ps 之间有一个明显的区别: 在第二个代码中,“incomingData”在每个周期都被初始化!

【讨论】:

  • 这是一个明显的区别,但表面上并不能解释行为。
【解决方案2】:

两个示例都不会编译,并出现错误

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

应该是

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

【讨论】:

    【解决方案3】:

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

    更传统的写法是

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

    您观察到的不同行为是,每次循环迭代都有一个新缓冲区,您会得到尾随空值,而不是前一次迭代留下的尾随垃圾。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2015-09-12
      • 2010-10-14
      • 1970-01-01
      • 2022-12-12
      • 2020-12-25
      • 1970-01-01
      • 2013-12-16
      相关资源
      最近更新 更多