System.out.print("Calculator ") 在其后跟在 IntelliJ IDEA 中采用 System.in 的 Scanner 或 BufferReader 时不显示输出

System.out.print("Calculator ") doesn't show an output when it is followed with a Scanner or BufferReader which takes a System.in in IntelliJ IDEA

所以我想做一个命令行计算器,在"Calculator "这个词后面有几个参数。但是使用以下代码我无法实现它。在这两种方法中,gradle 在显示单词 "Calculator " 之前等待读取该行。

使用扫描仪

System.out.print("Calculator ");
Scanner sc = new Scanner(System.in);
String inputString;
inputString = sc.nextLine();
String[] args = inputString.split( "\s+" );

使用 BufferReader

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Calculator ");
String str= br.readLine();
String[] args = str.split( "\s+" );

然而 System.out.println("Calculator ") 显示单词没有任何问题。但它不符合要求。所以它不能按我的意愿工作。更改代码行的顺序也没有帮助。

System.Console().printf() 也不是一个选项,因为我使用的是 Intellij IDEA。所以有人可以帮我解决这个问题,这样我就可以获得内联输入 reader。我还尝试通过在方法中单独实现来同步打印方法。那也行不通。

最后我要实现的是下面的格式

计算器 max 12 23 25 45

这是完整的代码

在输入控制台之前..

输入后

最新更新

所以我尝试对 Maven 项目执行相同的操作。 当我在 Intellij 中使用 maven 项目时,上述两种方法都非常有效。

因此这一定与gradle的运行项目方式有关。我想知道这是否有机会发生?

在完成任何输出后开始处理输入之前调用System.out.flush()。 IDE 正在使用管道连接到进程,并且不会自动刷新到每个输出中。

而不是 sc.nextLine() 你应该使用 sc.next().

这是一个 bug 在使用 IntelliJ IDEA gradle 插件时受到的关注太少,以至于 IntelliJ 团队似乎没有那么积极地解决这个问题。

我能想到的唯一解决方法是跳过 gradle 插件并直接从 IntelliJ IDEA 调用 gradle 包装器。为此,您可以使用我的 IntelliJ IDEA 插件 Gradle Run with Arguments (GitHub Link),或者手动创建一个 运行 配置,当您想要 运行 您的程序时调用 gradle 包装器。我建议您先试用我的插件,看看是否有帮助。

要手动创建调用 gradle 包装器的 运行 配置,最简单的方法是通过 IntelliJ IDEA 中的 JAR Configuration。为了使这成为可能,您还需要修补 gradle/wrapper/gradle-wrapper.jarMANIFEST 并附加一个 Main-Class 条目。通过这种方式,您可以从 IntelliJ IDEA 启动 gradle 包装器并享受 System.out.print(...).

限制:此方法不允许您使用内置调试器功能,因为 IntelliJ IDEA 会尝试调试 gradle 包装器本身而不是您的实际程序.

我可以通过修改 gradle 设置来获得输出: 文件 --> 设置 --> 构建、执行、部署 --> Gradle。有一个下拉菜单 Build and 运行 using: 有 Gradle 和 IntelliJ IDEA 选项。成绩是默认的。我选择了 IntelliJ IDEA,我的 System.outs 又活了过来。