读取不同类型变量时,扫描器异常



我有这样一个文件:

3
0.1
0.4
1

我是这样读的:

InputStream s = Main.class.getResourceAsStream("/file.txt");
Scanner scanner = new Scanner(s);
//Scanner scanner = new Scanner(path); **EDITED**
System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextInt());

InputMismatchException在代码的第三行抛出。我知道我可以使用readLine()并将其解析为int或double,但如果我的文件看起来像:

3 0.1
0.4
1

在这种情况下,在相同的位置抛出相同的异常

根据你的描述,这看起来像是一个地区问题。如Scanner docs所述:

该类的一个实例能够以标准格式和扫描器所在地区的格式扫描数字。扫描器的初始区域设置是Locale.getDefault()方法返回的值;它可以通过useLocale(java.util.Locale)法改变。reset()方法将扫描器的区域设置的值重置为初始区域设置,而不管它之前是否被更改。

我假定您的默认语言环境是波兰语言环境,其十进制分隔符是逗号。您可能希望更改输入文件以使用区域小数分隔符,或者使用小数分隔符为点的区域设置。例如,您可以在Scanner初始化之后添加以下行:

scanner.useLocale(Locale.US);

确保您使用FileInputStream源设置了路径。

Scanner scanner = new Scanner(new File("path/filename.ext"));
System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextInt());

我无法重现此错误。考虑下面的例子:

$ cat -A file
3$
0.1$
0.4$
1$
$ cat -A file2
5 0.1$
0.4$
1$
$ cat Test.java
import java.io.*;
import java.util.Scanner;
public class Test
{
  public static void main(String args[]) throws Exception {
    InputStream s = Test.class.getResourceAsStream(args[0]);
    Scanner scanner = new Scanner(s);
    System.out.println(scanner.nextInt());
    System.out.println(scanner.nextDouble());
    System.out.println(scanner.nextDouble());
    System.out.println(scanner.nextInt());
  }
}
$ javac Test.java 
$ java Test file
3
0.1
0.4
1
$ java Test file2
5
0.1
0.4
1

您发布的代码应该工作如预期

多亏了一些建议,我发现问题是Windows的行分隔符。Windows打印的不是"n",而是"rn",这是Scanner无法使用的。我检查了我的文件在Git Bash:

$ cat -A file.txt
3^M$
0.1^M$
0.4^M$
1

看起来应该是:

$ cat -A file.txt
3$
0.1$
0.4$
1
编辑:

事实证明,行分隔符与此无关。用户"acm"注意到这是一个地区问题-在波兰默认的十进制分隔符是逗号。非常感谢!

最新更新