缓冲读卡器:复位不会复位

时间:2014-12-15 15:46:03

标签: java bufferedreader reset

我目前正在学习BufferedReader的mark()和reset()方法,并希望执行以下操作:

我解析CSV,设置如下(空格作为分隔符):

555 value1
555 value2
600 foobar
700 whatever

使用第一个数字作为ID创建每一行,一个对象(地址)。多次使用ID时,我想比较第二列中的值,然后继续。

根据上面的数据,我的代码会将这两个值与ID 555进行比较,但无法使用第三行(ID 600)创建对象。

发现错误 :解析后的第一行。简单混合变量。

我的设置类似于:

br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
    br.mark(1000); //save current line

    List<String> list = new ArrayList<String>(Arrays.asList(line.split(delimiter)));
    Adress a = new Adress(Long.parseLong(list.get(0)); //create object

    while (((checkLine = br.readLine()) != null) && exit == false){

        List<String> nextLine = new ArrayList<String>(Arrays.asList(line.split(delimiter)));
        long nextId = Long.parseLong(nextLine.get(0)); 

        if( nextId == a.getId() ){
            System.out.println(nextId + " vs. " + a.getId());
            br.mark(1000); //mark the next line if it has the same ID

            //[...] do more stuff
        } else{
            exit = true;
        }

    }

    br.reset(); //reset to the last line with the ID
}

SYSOUT:

555 vs. 555
555 vs. 555
555 vs. 555

3 个答案:

答案 0 :(得分:0)

如果你的地址用空格分隔,地址的不同元素也用空格分隔,那么这行不会给你地址,它会给你元素。

List < String > list = new ArrayList < String > ( Arrays . asList ( line . split ( delimiter ) ) ) ;

答案 1 :(得分:0)

错误是以下变量混合(仅仅是我的愚蠢是错误!):

while (((checkLine = br.readLine()) != null) && exit == false){
    List<String> nextLine = new ArrayList<String>(Arrays.asList(line.split(delimiter)));
    [...]

List nextLine必须从line.split更改为checkline.split:

List<String> nextLine = new ArrayList<String>(Arrays.asList(checkLine.split(delimiter)));

感谢大家的帮助!

答案 2 :(得分:0)

我在代码中看到了几个问题:

  • 在第二个while()循环中,您仍在分割字符串“line”,但while循环将输入分配给“checkLine”。

  • 您不会将“exit”重置为false - 这可能发生在br.reset()之后。