使用 Scanner 接收输入时遇到的问题

A problem I encountered while using Scanner to receive input

提问人:brain 提问时间:11/25/2022 更新时间:11/25/2022 访问量:38

问:

new Thread(() -> {
    while (true){
        Scanner sc = new Scanner(System.in);
        StringBuilder builder = new StringBuilder();
        System.out.println("请输入要输出的文本:");
        while (sc.hasNextLine()) {
            builder.append(sc.nextLine());
        }
        System.out.println(builder.toString());
    }
}).start();

我想继续在线程中输入,但是当我第一次打印字符串时,程序没有按照我 expected.as 的方式工作 在此处输入图像描述 程序不断重复,但它并没有停止我输入。 你能帮我解决这个问题吗?

我试图用一个关于hasNext()的重载方法改变输入流的终止符。

new Thread(() -> {
    while (true){
        Scanner sc = new Scanner(System.in);
        StringBuilder builder = new StringBuilder();
        System.out.println("enter text information:");
        while (!sc.hasNext("#")) {
            builder.append(sc.nextLine());
        }
        System.out.println(builder.toString());
    }
}).start();

这段代码的结果与我的目标一致,但我不想使用另一个终止符而不是默认终止符。我该怎么办? 请帮帮我,谢谢!

Java Windows IO

评论

2赞 g00se 11/25/2022
此代码的结果与我的目标一致但你没有说明这个目标是什么。有一件事是肯定的 - 你不想创建一个循环Scanner
0赞 Stephen C 11/25/2022
事实上,您可能根本不应该在线程中创建。特别是如果主线程也要从标准输入中读取。Scanner
0赞 Mark Rotteveel 11/25/2022
在看似相关的问题中,当 while(sc.hasNextLine()) 遇到不同作者(代码非常相似)的 EOF 时,OP 终止了标准输入。

答:

0赞 Pradeesh Kumar 11/25/2022 #1

Scanner 类中的 hasNextLine() 方法始终返回 true,因为控制台一直有输入。 在 while look 中添加一个条件以检查输入字符串是否为 null 或空将解决此问题。

new Thread(() -> {
    Scanner sc = new Scanner(System.in);
    StringBuilder builder = new StringBuilder();
    System.out.println("请输入要输出的文本:");

    String input;
    while ((input = sc.nextLine()) != null && !input.isEmpty()) {
        builder.append(input);
    }
    System.out.println(builder);
}).start();

评论

0赞 rzwitserloot 11/25/2022
OP 遇到了相反的问题。
0赞 g00se 11/25/2022
...并且您重复在循环中打开 STDIN 的错误Scanner
0赞 rzwitserloot 11/25/2022 #2

Imagine 返回 false。然后你的内在while循环结束,它打印的内容,然后..循环,因为你把整个东西都包装在一个 .这个循环使另一个 System.in 扫描器并做同样的事情 - 这将给出相同的结果(即:仍然没有另一行)。它会再次返回 false,瞧 - 你会得到你的无限循环。hasNextLinebuilderwhile (true)

我不知道你想用 outher 循环完成什么 - 你不需要 2 while 循环。外面的应该被删除。除非我遗漏了你打算做的事情,否则从代码或你的问题中都不明显。while (true)

从某种意义上说,你的替代方法“甚至更糟”,如果用户输入了一些空格,然后在任何其他时间都返回,而在其他任何时候都是假的,而不使用他们输入的任何内容。至少,它会永远继续返回 false,直到您通过某些调用实际消耗一些令牌。.hasNext("#")true#.next()

通常,不要使用这些方法。只需调用适当的方法即可。如果你想处理无效的输入(例如,你要求一个,用户输入'hello',或者终止流中的标准),捕获异常并做出相应的反应。act-then-check-after优于check-first。hasX.next.nextInt()

评论

0赞 brain 11/25/2022
非常感谢您的回答!两层循环是因为我想实现在线程循环中接收用户输入的目标,其中每个用户输入可能有多行信息。有没有办法解决在第二次调用sc.hasNext()时总是返回false的问题?
0赞 rzwitserloot 11/25/2022
您如何区分一个用户输入了一些内容和下一个用户输入了这些内容?当然,计算机无法区分一个“输入”和另一个“输入”。