我有这样一个文件:
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);
确保您使用File
或InputStream
源设置了路径。
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"注意到这是一个地区问题-在波兰默认的十进制分隔符是逗号。非常感谢!