首页 > 解决方案 > 为什么 Scanner 在读取文件时不转到下一行?

问题描述

我正在使用以下代码读取文件:

Scanner fscanner = null;
try {
    fscanner = new Scanner(new File("spotify.txt"));
} catch (FileNotFoundException e) {

    e.printStackTrace();
}

while(fscanner.hasNextLine()) {
    String line = fscanner.nextLine();

    Scanner lineScanner = new Scanner(line);
    Album album = new Album();

    if(lineScanner.next().equals("CD")) {
        album.setComposers(lineScanner.next().replaceAll(",", "'s"));
        album.setAlbumName(lineScanner.useDelimiter(",").next().trim());
        album.setYear(lineScanner.next().trim());
        fscanner.nextLine();

        String c = album.getAlbumName();
        String a = album.getComposers();
        String y = album.getYear();

        System.out.println(a+" "+c+" "+y);

    }
    else if(lineScanner.next().equals("SONGS")) {
        ArrayList<String> songs = new ArrayList<String>();
        ArrayList<String> songDur = new ArrayList<String>();

        lineScanner.nextInt();

        songs.add(lineScanner.useDelimiter(",").next());
        songDur.add(lineScanner.next());

        album.setSongs(songs);
        album.setSongDurations(songDur);

        for(int i=0, j=0;i<songs.size() && j<songDur.size();i++, j++)
            System.out.println("SONG "+i+" "+songs.get(i).toString()+ " "+songDur.get(j).toString());

        System.out.println(album.showSongs());
        System.out.println(album.showSongDurations());

    }
    else if(lineScanner.next().equals("ADD")) {
        Adds adds = new Adds();

        adds.setCompanyName(lineScanner.useDelimiter(",").next().trim());
        adds.setDuration(lineScanner.next());
    }
}

该文件看起来像这样:

CDS
CD U2, Songs of Innocence, 2014
SONG 1, The Miracle, 4:15
SONG 2, Every Breaking Wave, 4:12
SONG 3, California, 4:00
SONG 4, Song for Someone, 3:47
CD Coldplay, Parachutes, 2000
SONG 1, Don’t Panic, 2:17
SONG 2, Shiver, 5:00
SONG 3, Spies, 5:19
SONG 4, Sparks, 3:47
SONG 5, Yellow, 4:27
CD ImagineDragons, Night Visions, 2015
SONG 1, Demons, 3:14
SONG 2, Monster, 2:57
ADDS
ADD ING Bank, 0:20
ADD Bol.com, 0:15
ADD Albert Heijn, 0:30
ADD Specsavers, 0:15
ADD Kruidvat, 0:10
ADD MediaMarkt.nl, 0:20

问题是我正在 NoSuchElementException排队else if(lineScanner.next().equals("SONGS"))

我根本不知道为什么会发生这种情况,如果我删除了两个else-ifs.

它给出的输出完全符合预期,但当我介绍那些else-ifs.

我如何解决它?

标签: javafilejava.util.scannerfile-handling

解决方案


在第一行,您将读取第一个标记并检查它是否等于CD; 然后如果不是,您将尝试读取另一个令牌(从同一行)以检查它是否等于SONGS,这将在第一行引发错误,因为没有更多令牌可以从该行读取。

您将希望在 if/else if 之前将该行的第一个标记读入一个变量,并在您的条件中引用该变量,以便它们都检查一行的第一个标记。

作为旁注,我会避免使用两种不同的扫描仪;如果我没记错的话CD,你在调用时错误地跳过了分支中的一行fscanner.nextLine();,这只有在你到处使用相同的扫描仪时才有用(丢弃一行未使用的其余部分)。在这种情况下,nextLine 调用应该放在 if/else if 之后以避免重复。


推荐阅读