我对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完成吗?谢谢你的时间
答案 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());