当扫描仪从输入文件中读取时,我似乎在为扫描仪而苦恼。我仍在学习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);
}
答案 0 :(得分:0)
您需要在定界符中添加\n
,因为如果没有,它将加上数字,直到下一个:
,即下一行
然后处理数字周围的多余空格,这是2个选项:
使用定界符"[:\\n]"
和Long.parseLong(in.next().trim())
:您将读取空格,但在解析之前将其删除
使用定界符"\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+) *"
如果匹配,则只需提取捕获组。