【问题标题】:Java application console promptJava 应用程序控制台提示符
【发布时间】:2020-05-12 01:07:52
【问题描述】:

我编写了以下 Java 代码来显示提示并在命令行上读取一些命令:

try(Scanner keyboard = new Scanner(System.in)) {
    while (true) {
        System.out.print(">> ");
        System.out.flush();
        System.out.println(keyboard.nextLine());
    }
}

提示符('>>')未显示。 无论如何,如果我在命令行上输入文本并按回车,提示符会显示在 println 的输出之前。 有什么办法可以强制提示正确显示?我的理解是使用flush就足够了。

如果我运行测试,这就是我现在在控制台中看到的内容

test
>> test
this
>> this
again
>> again

如您所见,在输入由keyboard.nextLine()读取的文本后显示提示。

【问题讨论】:

  • 我认为将当前输出和预期输出添加到问题中会有所帮助。
  • 嗯,第一次迭代没有输出。输入命令并读取一行文本后,我看到了来自 println 的提示和输出。

标签: java console stdin


【解决方案1】:

我在 IntelliJ 中运行控制台应用程序,而如果我从终端运行 jar 看起来一切正常。结果,看起来 IntelliJ 输出窗口搞砸了。

【讨论】:

    【解决方案2】:

    在 Java 中,所有字符串都是字符数组,其末尾附有“\0”(也称为空终止字符)。例如,如果我有一个string str = "hello";,实际上str 实际上是一个 6 个字符的数组: ['h', 'e', 'l', 'l', 'o', '\0']

    flush() 只是删除字符串">> " 后面的'\0'。这里的主要问题是您在提示用户之前已经在输入中读取了Scanner。要在询问前进行提示,请将 println() 语句移到顶部。

    System.out.println(">> "); //assuming this is your prompt
    try(Scanner keyboard = new Scanner(System.in)) {
    while (true) {
          //some code
       }
    }
    

    您的另一个选择是将.nextline(); 更改为.next();。两者的区别是

    • nextLine():将此扫描器前进到当前行并返回被跳过的输入。
    • next():从这个扫描器中查找并返回下一个完整的令牌。

    有关Scanner函数的更多参考,您可以阅读它们here

    【讨论】:

    • 把它放在前面不会改变结果。谢谢。
    • 同样将 nextLine 替换为 next 不会改变任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多