0

我正在编写一个简单的 Java 控制台应用程序,其中程序将提示用户输入内容,然后程序控件将等待用户输入并使用该输入执行某些操作。

问题是:在控制台上输入时,用户看不到他在输入什么。我应该做些什么不同的事情,以便用户可以看到他正在输入的内容?(用户可以在点击“输入”后看到他输入的内容)。

我创建了一个 java 独立项目,并从命令行使用 netbean 的 ant 命令构建并运行了该项目:

ant run

以下是我拥有的全部代码。OS是Windows 7。jdk版本:1.6

下面是我用来从控制台获取用户输入的代码。

import java.io.*;

public class StatLibraryTest {


 public static void main(String[] args) {
    String CurLine = ""; // Line read from standard in


   try{

          while (!(CurLine.equals("quit"))){
              System.out.println("Enter: " );
              CurLine = readLine();

              if (!(CurLine.equals("quit"))){
                  System.out.println("You typed: " + CurLine);
              }
          }
       }catch(Exception e){
            System.out.println(e.getMessage());
       }

  }


    public static String readLine()
    {
        String s = "";
        try {
            InputStreamReader converter = new InputStreamReader(System.in);
            BufferedReader in = new BufferedReader(converter);
            s = in.readLine();
        } catch (Exception e) {
            System.out.println("Error! Exception: "+e); 
        }
        return s;
}
}
4

1 回答 1

3

字符回显通常由操作系统的终端驱动程序或(在现代系统中)终端仿真器处理。它独立于Java ...或应用程序编写的其他任何东西......除非应用程序关闭了字符回显或其他东西。

所以 ...

我们需要您解释您如何运行导致连接到的控制台System.in进入“无回显”模式的应用程序。


我不知道这是否是您问题的原因,但是您的readLine方法不正确。每次调用readLine它都会创建一个新的InputStreamReaderBufferedReaderfor System.in。这是低效的。但更糟糕的是,它很容易丢失输入。您会看到,当in.readLine()被调用时,输入堆栈将read调用System.in以读取当前可用的所有输入。如果多行可用(因为用户已经提前键入......或者因为应用程序已使用从文件重定向的标准输入调用),则您BufferedReader的缓冲区中可能会出现多行。该readLine()调用返回第一行......但其余的被丢弃

处理 EOF 的方式也有一个错误。in.readLine调用将在看到 EOF 时返回 a ,null但您没有处理它。


我怀疑你没有得到回声的原因与你运行程序的方式有关......使用 Ant。尝试直接从命令行运行程序;即运行java StatLibraryTest


最后,您的代码存在一些样式问题:

  • 您的标识符 ( CurrLine) 违反了 Java 标识符名称规则。
  • 缩进不一致
  • 您对嵌入式空格的使用不一致
  • 捕捉Exception通常是一个坏主意。捕获您期望的特定异常(例如 IOException)。
  • 如果你的代码不能用它做一些明智的事情,最好让异常传播。具体来说,如果readLine捕获到异常,调用者将得到一个空字符串。它无法将其与有效输入区分开来;例如,用户输入一个空行。你应该声明readLinethrows IOException.
于 2013-05-18T06:09:55.500 回答