【问题标题】:How to read Multiple line input [closed]如何阅读多行输入
【发布时间】:2020-06-13 22:59:32
【问题描述】:

我正在尝试读取多行输入,就像复制过去的输入一样,但我无法结束 while 循环以停止读取。这是我的代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input =null;
        while(sc.hasNext()) {
            input=sc.next();

        }
        String [] split = input.split(" ");
        for(int i = 0;i<split.length;i++) {
            for(int j = split[i].length()-1;j>=0;j--) {
                System.out.print(split[i].charAt(j));
            }
            System.out.print(" ");
        }
        sc.close();
    }

}

【问题讨论】:

    标签: java


    【解决方案1】:

    hasNext() 方法将查看是否有要阅读的内容。为此,它可能会阻塞并等待使用的InputStream,如documentation of hasNext() 中所述:

    public boolean hasNext()

    如果此扫描器在其输入中有另一个令牌,则返回 true。 此方法可能会在等待输入扫描时阻塞。扫描仪不会超过任何输入。

    InputStream 结束时,它将从hasNext() 调用返回并返回false,因为没有要读取的令牌(并且数据/字节的源已关闭)。但是,由于您是通过System.in 从键盘读取,所以输入没有“结束”,因为您仍然可以在应用程序中输入新文本,while() 循环将读取这些文本。

    有几种解决方案:

    1. 根据您启动 Java 应用程序的方式,您可以按 CTRL-D 显式关闭“附加”的所谓“STDIN”流到您的键盘输入。这样流System.in 将结束并且不能读取更多数据。 Scanners hasNext() 方法也检测到这一点,该方法将在此时返回 false

    2. 您可以调用您的 java 应用程序,在其中通过文件或其他命令为“STDIN”流提供数据。例如:echo "data" | java Mainjava Main &lt; inputData.txt(取决于您使用的终端/控制台)。

    3. 为您的内容添加一个结束标记并查找它。当您在数据中放置"MY_TEXT_END" 之类的文本并查找它时,您可以在while() 循环内使用简单的equals() 检查并在看到标记"MY_TEXT_END" 时停止阅读。

      李>

    【讨论】:

      【解决方案2】:

      由于您使用的是while 循环,只要指定条件为真/满足,它将循环/执行代码块。

      在这里,您正在检查退出循环的任何条件。此方法可能会在等待输入扫描时阻塞,并且扫描仪不会超过任何输入。

      我看到的另一个差距是,您一次又一次地将输入重新分配给input var,而没有事先执行任何操作来接受下一行。

      您可以在此处更清楚地了解退出 while 循环:

      How to get out of while loop in java with Scanner method "hasNext" as condition?

          Scanner sc = new Scanner(System.in);
          String input = null;
      
          while(sc.hasNext() && !(input = sc.next()).equals("exit")) {
              System.out.println(input);
          }
      
          sc.close();
      

      因此,要回答您的问题,您必须为 while 循环提供一些检查/退出条件,以使循环无效并退出循环。

      【讨论】:

      • 首先感谢您的帮助,在完成所有初始代码后我已经尝试过了,并且在某些时候我得到了它,但只是一个独特的文本。
      • 例如退出循环我使用了行数或者当它到达一个空行时,问题是给出的文本是由这个组成的:(下一条评论)它在文本中间像一个双(回车)
      【解决方案3】:

      使用缓冲区读取器类,这样您就可以同时接受多个输入。

      https://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 2012-07-24
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多