当按 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
我正在尝试在 Java 中模拟“ping”命令。我只提取了我认为与我的问题相关的行。因此,当 运行ning 这段代码时,每秒打印一次“Pinging...”,直到用户按下 ENTER。按下 ENTER 后,它会打印在控制台“Exit ping”中。并且应用程序停止。问题是当应用程序 运行s 使用 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。
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;
}
}
}
我正在尝试在 Java 中模拟“ping”命令。我只提取了我认为与我的问题相关的行。因此,当 运行ning 这段代码时,每秒打印一次“Pinging...”,直到用户按下 ENTER。按下 ENTER 后,它会打印在控制台“Exit ping”中。并且应用程序停止。问题是当应用程序 运行s 使用 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。
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;
}
}
}