2017-07-07 41 views
1

我目前正在使用Java Scanner类,并且出现了一个非常奇怪的InputMismatchException。我初始化扫描仪这样的:即使下一个标记符合数据类型,Java扫描程序仍会抛出InputMismatchException

Scanner in = new Scanner(new File(fileName)); 

in.useDelimiter("\n?.*:");

当我打电话System.out.println(in.next());,它打印1500到命令行,这是正确的值。但是,如果我拨打System.out.println(in.nextInt());,Scanner将抛出InputMismatchException。我不认为我正在打印末尾的换行符或空格,而且我为什么会发生这种情况已经丢失了。

编辑:下面是什么我读的数据格式:

Data Description:100 Next Data Description:200

编辑:调用Integer.parseInt(in.next());导致NumberFormatException: For input string: "1"00

+0

[Works for me](http://ideone.com/bc7hyk)。 –

回答

1

InputMismatchException并不奇怪,因为你的正则表达式不是跨平台兼容的。您可能是Windows用户,因此您的文本文件将具有\r\n,因为它是行结尾,而不仅仅是\n

因此适当的图案将是:

in.useDelimiter("\r?\n?.*:"); 

要接受\r\n或单个\n

您也可以尝试用System.lineSeparator()合作,以支持不同的行尾,但那么你就需要来包装与parenthese所以正则表达式量词?适用于这两个字符\r\n适用于Windows系统:

in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator())); 

的这种方法的问题在于,当使用Windows作为操作系统时,它失败了,但是从其他地方接收文件,其本身仅使用\n。所以我推荐第一种方法。

+1

可以在正则表达式中使用'\ R'来匹配任何Unicode换行符,所以''\\ R?。*:''会更好。 –

相关问题