当按下 Enter 时,Java 中的循环不会中断,当条件是 DataInputStream.isAvailable() == 0 并且应用程序使用 telnet 运行时

Posted

技术标签:

【中文标题】当按下 Enter 时,Java 中的循环不会中断,当条件是 DataInputStream.isAvailable() == 0 并且应用程序使用 telnet 运行时【英文标题】:While loop in Java doesn't break when pressing Enter, when condition is a DataInputStream.isAvailable() == 0 and the application runs with telnet 【发布时间】:2020-11-05 00:40:29 【问题描述】:

我正在尝试在 Java 中模拟“ping”命令。我只提取了我认为与我的问题相关的行。因此,当运行此代码时,它每秒打印一次“Pinging...”,直到用户按下 ENTER。按下 ENTER 后,将在控制台“退出 ping”中打印。并且应用程序停止。问题是当应用程序使用 telnet 运行时,ENTER 按钮没有任何作用。注意:整个应用程序是一个 OSGi 应用程序,它可以使用 telnet 或不使用它运行,所以在这两种情况下我应该有相同的行为。只有在不使用 telnet 时才能正常工作。

    DataInputStream dis = new DataInputStream(System.in);
    System.out.println("Press Enter to stop.");
    while (dis.available() == 0) 
        System.out.println("Pinging...");
        Thread.sleep(1000);
    
    System.out.println("Exit ping.");

如果我在“while”循环的末尾添加

System.out.println(dis.available())

没有 telnet,它打印 0,当按下 ENTER 时,它打印一个值!= 0。使用 telnet,即使按下 ENTER,该值也是 0。

【问题讨论】:

【参考方案1】:

dis.available() 实际上不会检查用户输入,它不是读取。

您实际上需要在单独的线程上等待用户输入,因为您想在主线程中继续循环。下面的例子

import java.util.Scanner;

public class GeneralMain 
    private static boolean exit = false;

    public static void main(String[] args) throws InterruptedException 

        System.out.println("Press Enter to stop.");
        Thread t = new Thread(new ReadFromCmd());
        t.start();
        while (!exit) 
            System.out.println("Pinging...");
            Thread.sleep(1000);
        
        System.out.println("Exit ping.");
    

    static class ReadFromCmd implements Runnable 
        @Override
        public void run() 
            Scanner s = new Scanner(System.in);
            s.nextLine();
            exit = true;
        
    

【讨论】:

以上是关于当按下 Enter 时,Java 中的循环不会中断,当条件是 DataInputStream.isAvailable() == 0 并且应用程序使用 telnet 运行时的主要内容,如果未能解决你的问题,请参考以下文章

当按下另一个可触摸的不透明度时,一个可触摸的不透明度不会按下

HTML中的Javascript,努力使for循环为按钮工作

Endles循环(while循环)运行,直到我按下一个键。编程C

在程序运行时按下“ENTER”时提供状态更新

当按下返回按钮时,listview 会顶部。如何解决?

当按下不同的键时如何更改精灵表中的帧。 XNA