为什么我还没有打电话给readLine()时仍能输入控制台?

时间:2014-08-04 07:42:03

标签: java input bufferedreader

我想使用JOptionPane制作一个从控制台读取输入的演示。如果我先输入br.readLine()然后使用JOption...输入对话框没有显示,我仍然可以在控制台中写,就像有人会等待它...我想要显示输入对话框。

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.swing.JOptionPane;

public class Kalkulator {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Type number");
            int liczba1 = Integer.valueOf(br.readLine());
            br.close();
            int liczba2 = Integer.valueOf(JOptionPane.showInputDialog("Type number"));
            System.out.println(liczba1 + liczba2);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

2 个答案:

答案 0 :(得分:4)

只是因为System.in是一个流。键入时,提供数据。该数据存储在某种队列中。

当一个人调用br.readLine时,会读出一部分队列(有时会阻塞直到提供数据)......

关闭流只是意味着您回收一些资源(例如,再次将文件标记为可用)。现在控制台不断接受数据。你不会再读它了。

由控制台程序(bashshcmd.exe,...)来处理用户输入数据的事实。然后,控制台程序将输入的值重定向到System.in。 Java无法控制该程序...

答案 1 :(得分:2)

您始终可以在控制台中输入内容。没有人必须倾听。在控制台中键入时,字符存储在名为 stream 的缓冲区中。如果没有人正在读取流,那么该角色就会排队。调用br.readLine()会从流中提取字符,直到看到换行符。

这些天来,大多数游戏机都会回复自己输入的字符,而且你通常无法将其关闭,所以即使你已经停止收听,用户仍然可以打字(毫无意义)。如果你不想要它们,并且你认为它们可能会这样,那么你能做的最好的就是输出一条消息告诉他们不要(礼貌地)。