使用定界符无法读取nextLong()

时间:2019-01-29 15:44:48

标签: java java.util.scanner

当扫描仪从输入文件中读取时,我似乎在为扫描仪而苦恼。我仍在学习Java的绳索,如果有人可以帮助我,我将不胜感激。

我的主要方法是假设读取一个输入文件,并根据下一行的第一个字母将其制作为歌曲对象或图像对象,然后将其添加到类型为supper类的数组中。这是我用于读取输入文件的代码的一部分:

while(in.hasNextLine()) {
        in.useDelimiter(":");
        fileType = in.next().trim();
            if(fileType.equals("S")) {
                fileName = in.next().trim();
                artistName = in.next().trim();
                albumName = in.next();
                fileSize = in.nextLong(); //when it gets to this line, it gives a InputMisMatchException

                Song newSong = new Song(fileName, fileSize, artistName, albumName);
                mediaArray.add(newSong);
            }

3 个答案:

答案 0 :(得分:0)

  1. 您需要在定界符中添加\n,因为如果没有,它将加上数字,直到下一个:,即下一行

  2. 然后处理数字周围的多余空格,这是2个选项:

    1. 使用定界符"[:\\n]"Long.parseLong(in.next().trim()):您将读取空格,但在解析之前将其删除

    2. 使用定界符"\s*:\s*|\n"并保留in.nextLong():您将不会读取空格,而能够直接读取double

答案 1 :(得分:0)

解决问题的方法在于将定界符更改为:

"\\s*:\\s*|\n"

如果您在下面尝试此示例,它将不会在in.nextLong()上引发异常:

public static void main(String[] args) {

    String example = "S : Pink Bullets.mp3:  The Shins       :Chutes Too Narrow  :  105276041\n" +
            " I : CatamaranCruise#2.JPG   :  462   :  2010   :  33921\n" +
            " S : 16 Military Wives.mp3: The Decemberists        :Picaresque  : 431760781\n" +
            " S : Saint Simon.mp3:   The Shins       :Chutes Too Narrow  :  349515394\n" +
            " S : Sweet Disposition.mp3: The Temper Trap         :Conditions  :  45810162\n" +
            " I : CyberPatriotRound3.JPG   :  752   :  2011   :  25518\n" +
            " I : 15192479739_d343588b32_o.jpg   :  1652   :  2014   :  250959";
    Scanner in = new Scanner(example).useDelimiter("\\s*:\\s*|\n");
    String fileType;
    String fileName;
    String artistName;
    String albumName;
    long fileSize;
    while(in.hasNextLine()) {
        fileType = in.next().trim();
        if (fileType.equals("S")) {
            fileName = in.next().trim();
            artistName = in.next().trim();
            albumName = in.next();
            fileSize = in.nextLong(); //when it gets to this line, it gives a InputMisMatchException
        }
    }
}

为什么此分隔符起作用?该定界符从提取的令牌中“删除”空格,因此删除了令牌周围的数字。

答案 2 :(得分:0)

另一种选择是对整个事情使用正则表达式。我知道这可能不是您要的,只是一个想法。也可能不在您的舒适范围内。

正则表达式如下:

"S: *(.*?) *: *(.*?) *: *(.*?) *: *(\d+) *"

如果匹配,则只需提取捕获组。