【问题标题】:Satisfy two conditions in a while loop在while循环中满足两个条件
【发布时间】:2017-03-04 06:04:14
【问题描述】:

我用 Java 执行一个进程。该进程永远不会终止并扫描机器以查找某些文件,当它找到其中一个时,它会打印文件的路径。我想执行该过程一段时间并获得输出。这是我的一段代码

  BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
Process p = pb.start();
    while ((System.currentTimeMillis() <= endTime )){ //loop 1
     while((line=stdInput.readLine()) != null){ loop 2
        System.out.println(line);
       }
    }
p.destroy();

问题在于,如果脚本在短时间内找不到结果,则循环 2 将退出并且在此期间不再运行。

我也试过了

while ((System.currentTimeMillis() <= endTime ) || (line=stdInput.readLine()) != null))

但在这种情况下,如果stdInput.readLine() 仍然返回结果,即使时间结束,循环也不会结束。

while ((System.currentTimeMillis() <= endTime ) && (line=stdInput.readLine()) != null))

在这种情况下,如果line=stdInput.readLine()没有返回结果,即使时间没有结束,循环也会退出

编辑: 我试过这段代码

System.out.println("Before while");
while ((System.currentTimeMillis() <= endTime ){
        System.out.println("while");    
         if(line=stdInput.readLine())!= null){
          System.out.println("One line");
        }
    }
        p.destroy();

如果进程没有检测到任何东西,循环永远不会结束,这就是输出

好的 之前 而

System.out.println("while");当它应该被调用 5 秒时,它只被调用了一次。

【问题讨论】:

    标签: java while-loop


    【解决方案1】:

    如果 stdInput 来自扫描仪,它可能永远不会为空。显示更多代码。

    至于 madmax 所说的,是的,做短路。对于 0 AND 1 = 0,这意味着 0 AND something = 0。这是数学。​​

    【讨论】:

    • 是的,它是一台扫描仪
    • 那就像我说的那样。通过声明while((line=stdInput.readLine()) != null){},您基本上是在说“虽然我从扫描仪收到的输入不为空,但我继续循环。”。我看不出有办法让它这样结束。
      你可以做的是while( !(line=stdInput.readLine()).isEmpty() &amp;&amp; (System.currentTimeMillis() &lt;= endTime ) ){}。像这样,您正在验证输入是否为空字符串以及当前时间是否小于 endTime。
    • 按照我上面所说的,你可以使用一个标志来代替!(line=stdInput.readLine()).isEmpty(),所以它会类似于:!(line=stdInput.readLine().equals( flag ))
    【解决方案2】:

    尽量不要使用短路 &&。

    使用 &,这将确保两个条件都被检查。使用 && 如果第一个是假的,那么整个事情就很短了。

    您希望 readLine() 无论如何都执行吗?如果第一个条件为假,则 && 甚至永远不会查看第二个条件。

    & 将检查两者然后做出决定。

    【讨论】:

    • 谢谢,但我看不出这对我有什么帮助
    【解决方案3】:

    你的意思是:

    while ((System.currentTimeMillis() <= endTime ){
        if(line=stdInput.readLine())!= null){
            System.out.println(line);
        }        
    }
    

    【讨论】:

    • 谢谢它看起来不错,但它不工作,我更新了更多细节的问题
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多