为什么在 BufferedReader 期间检查每行 isEmpty 会对 Java 逐行读取文件产生影响

问题描述 投票:0回答:1

我有一段读取文件的代码。文件的内容只是每行的一个 id。没什么特别的。但是,我不确定为什么此代码的每种样式都会产生不同的结果。

文件内容如下

a9c536f6-592f-4458-b61b-6ed3f875e990
d6b384d3-8fae-2dd3-ed06-b57cb65b093c
31474dd6-5c3b-4dc4-82cb-7e05121a77e1
b37dd457-da49-4972-9e3d-cd642e975562
f88df909-35bc-453c-b706-d48b5a11af9a
5d75083b-c4a8-4ad1-8494-645aaabfb283
85d8170e-8982-43c2-b574-9d7fe96d1b46
68bf33d0-1b5e-480c-83f2-ae38d9e0c8c8
26ea9d4a-f509-43b2-850f-cc445dccfd33
f9e9bd88-f67d-4e66-b281-eceeb57985eb
    @Test
    void testReadFile() throws Exception
    {
        String fileName = "/Users/user/Downloads/payload";
        // #1
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        Set<String> readUsingCollect = reader.lines().filter(l -> !l.isEmpty()).collect(Collectors.toSet());

        reader = new BufferedReader(new FileReader(fileName));
        String row;

        // #2
        Set<String> readUsingNonEmpty = new HashSet<>();
        while ((row = reader.readLine()) != null && !row.isEmpty()) {
            readUsingNonEmpty.add(row);
        }

        reader = new BufferedReader(new FileReader(fileName));

        // #3
        String row1;
        Set<String> readNonCheckingNonEmpty = new HashSet<>();
        int counter = 0;
        while ((row1 = reader.readLine()) != null) {
            if (row1.isEmpty()) {
                counter += 1;
            }
            readNonCheckingNonEmpty.add(row1);
        }

        Sets.SetView<String> difference = Sets.difference(readNonCheckingNonEmpty, readUsingNonEmpty);

        System.out.println("Size readUsingCollect: " + readUsingCollect.size());
        System.out.println("Size readUsingNonEmpty: " + readUsingNonEmpty.size());
        System.out.println("Size readNonCheckingNonEmpty: " + readNonCheckingNonEmpty.size());
        System.out.println("Counter: " + counter);
        System.out.println("Difference in size: " + difference.size());
        reader.close();
    }

这是运行上述代码的结果

Size readUsingCollect: 7525
Size readUsingNonEmpty: 5498
Size readNonCheckingNonEmpty: 7526
Counter: 2
Difference in size: 2028

我想知道为什么#2 产生的结果与#3 和#1 不同。文件内容没有空行。最让我困惑的是我希望 #1 和 #2 是相同的,但它们是不同的。

java bufferedreader filereader
1个回答
0
投票

具有相同数据负载的相同代码给出了三组的正确结果。

在输入中,您只提供 10 行内容,那么第 1 组的大小如何给出 7525?
您正在读取每一行并将其存储在字符串集中,因此大小应该仅为 10。

您可以重新检查一下文件吗?我怀疑可能有空格和换行符

就像他说的,尝试打印出每组的输出并进行比较,就会发现差异

© www.soinside.com 2019 - 2024. All rights reserved.