我正在尝试创建一个简单的方法,逐行读取指定的文本文件,然后它将打印到控制台的每一对可能的行。我试图这样做,但它显示了一个奇怪的结果。我的代码如下所示:
public class MyList{
List<String> elements = new LinkedList<>();
public void createPairs() throws IOException {
Scanner scanner = new Scanner(new File("file.txt"));
scanner.useDelimeter("\n");
while(scanner.hasNext()){
elements.add(scanner.next());
}
scanner.close();
for(String i: elements){
for (String j:elements){
System.out.println(i+" "+j);
}
}
}
出于某种原因,它显示单行循环多次,而最后一行则正确打印对。即如果file.txt包含:
1
2
3
结果将是:
1
2
3
1
2
3
... //it loops for some time
3 1
3 2
3 3
将文件读入列表可能没问题,因为当我尝试简单地打印&#34;元素时,#34;列出它正确显示文件的每一行在单独的List元素中。 我不确定我在这里做错了什么......请帮助。
答案 0 :(得分:3)
您使用的是Windows机器,不是吗?
在Windows上,换行符由\r\n
代替\n
。因此,当您在创建文件时按Enter键时,实际上是在创建\r\n
个字符。
这意味着您的文本文件与您的代码类似:
1\r\n2\r\n3
现在,您尝试使用扫描程序读取它,分隔符为\n
。会发生什么是它读取以下字符:
1\r
2\r
3
现在,当您尝试打印\r
字符时,会发生一些完全不同的事情。 \r
是回车。这是打字机时代的遗留人物之一。在打字机上,当您按下回车键时,“光标”返回到行的开头,然后您必须按新行键才能开始换行。那么如果只按下回车键会发生什么?它将覆盖最初在行开头写的内容!所以下面的例子只会打印“世界”。
System.out.println("Hello\rWorld");
这就是为什么你得到这个时髦的输出。
要解决此问题,请停止使用分隔符并在扫描仪上尝试nextLine
,无论操作系统如何,它都会读取整行。