文件[Java]

时间:2017-11-17 06:47:25

标签: java

我正在尝试创建一个简单的方法,逐行读取指定的文本文件,然后它将打印到控制台的每一对可能的行。我试图这样做,但它显示了一个奇怪的结果。我的代码如下所示:

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元素中。 我不确定我在这里做错了什么......请帮助。

1 个答案:

答案 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,无论操作系统如何,它都会读取整行。