Java多线扫描输入

时间:2017-10-16 11:26:37

标签: java input java.util.scanner multiline

我对Scanner及其从System.in进行输入的方式有一个具体问题。

我想做什么:我需要阅读System.in提供的单个输入。问题是这个输入可以有多行(输入可以有很多\n个字符)。

我尝试了什么:

我尝试的显而易见的事情是Scanner.nextLine()方法,但当然,这不会读取所有数据。我接下来要做的就是:

Scanner sc = new Scanner(System.in);
List<String> data = new ArrayList<>(); 

while(sc.hasNextLine()){
    String line = sc.nextLine();
    if(line.isEmpty()){
        break;
    }
    data.add(line);
}

但这也会跳过很多数据 - 例如,当给定文本中间有一个空行时。

我还试图删除break;语句,并希望while(sc.hasNextLine())循环会自行中断,但这种情况永远不会发生,因为扫描程序会等待数据。

这可以用Java完成吗?谢谢你的时间

3 个答案:

答案 0 :(得分:0)

如果在OS X上按Command + D或在Windows上按Control + D,则会插入行尾字符。

当扫描仪到达行尾字符时,hasNextLine将返回false并且循环将终止。

所以删除它:

if(line.isEmpty()){
    break;
}

并在多行输入后键入行尾字符。

或者,如果允许,您可以将输入作为字符串输入扫描仪。例如,如果要输入此输入:

Hello World
This is a
Multiline
input

您可以像这样初始化扫描仪:

Scanner line = new Scanner("Hello World\n" +
        "This is a\n" +
        "Multiline\n" +
        "input");

或者您可以将输入放入文件中,让扫描仪读取:

Scanner line = new Scanner(new File("path to your input file"));

答案 1 :(得分:0)

使用此类型进行阅读

String read = "";
    Scanner sc = new Scanner(System.in);
    String line;
    while (sc.hasNextLine()) {
        line = sc.nextLine();
        if (line.isEmpty()) {
            break;
        }
        read += line + "\n";
    }
    System.out.println(read);

在这里,首先我们检查是否有下一行。如果是,则使用sc.nextLine()方法读取数据,如果读取数据为空,则断开循环。

答案 2 :(得分:0)

如果要在多行上读取所有输入到字符串列表中,每个输入行一个元素,则用户必须指示输入何时结束。这通常通过使用文件结束字符来完成:在Windows命令提示符下,它是Ctrl-Z,在Linux,OS X和所有平台上的IntelliJ IDE输入窗口中,它都是CTRL-d。

您可以使用以下代码阅读这些行:

Scanner sc = new Scanner(System.in);
List<String> data = sc.tokens().collect(Collectors.toList());