2

我正在尝试从我的 java 代码中读取一个csv文件。使用以下代码:

public void readFile() throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    lines = new ArrayList<String>();
    String newLine;
    while ((newLine = br.readLine()) != null) {
        newLine = br.readLine();
        System.out.println(newLine);
        lines.add(newLine);
    }
    br.close();
}

我从上面的代码中得到的输出是该方法读取并返回的每一行 [2nd, 4th, 6th lines] readLine()。我不确定为什么存在这种行为。如果我在阅读 csv 文件时遗漏了什么,请纠正我。

4

3 回答 3

7

第一次读取该行而不在while循环中对其进行处理,然后您将再次读取它,但这次您正在处理它。readLine()方法读取一行并将读取器指针移到文件中的下一行。因此,每次使用此方法时,指针都会递增 1,指向下一行。

这个:

 while ((newLine = br.readLine()) != null) {
        newLine = br.readLine();
        System.out.println(newLine);
        lines.add(newLine);
    }

应该改成这样:

 while ((newLine = br.readLine()) != null) {
        System.out.println(newLine);
        lines.add(newLine);
    }

因此读取一行并处理它,而不是读取另一行然后处理。

于 2012-08-16T15:11:46.810 回答
1

您需要删除循环体中的第一行 newLine = br.readLine();

于 2012-08-16T15:10:09.067 回答
0

在java 8中,我们可以轻松实现

InputStream is = new ByteArrayInputStream(byteArr);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
List<List<String>> dataList = br.lines()
           .map(k -> Arrays.asList(k.split(",")))
           .collect(Collectors.toCollection(LinkedList::new));

外部列表将具有行,内部列表将具有相应的列值

于 2020-06-03T10:50:09.507 回答