扫描仪定界符与输入文件(Java)不按预期工作
我正在编写一个程序,从一个文本文件中读取输入,该文件将始终遵循char:int格式,例如:扫描仪定界符与输入文件(Java)不按预期工作,java,file,java.util.scanner,Java,File,Java.util.scanner,我正在编写一个程序,从一个文本文件中读取输入,该文件将始终遵循char:int格式,例如: A:3 B:1 C:2 D:2 (这里是eof) 我想读入字符及其对应的数字,忽略冒号 在我的程序中,我有以下声明和初始化: String fileName = "input.txt"; File file = new File(fileName); Scanner in = new Scanner(file).useDelimiter(":"); 然后,我尝试使用以下循环读取我的文件: while(
A:3
B:1
C:2
D:2
(这里是eof)
我想读入字符及其对应的数字,忽略冒号
在我的程序中,我有以下声明和初始化:
String fileName = "input.txt";
File file = new File(fileName);
Scanner in = new Scanner(file).useDelimiter(":");
然后,我尝试使用以下循环读取我的文件:
while(in.hasNextLine()){
String t = in.next();
int n = in.nextInt();
....
}
当我尝试在Eclipse中运行我的程序时,我收到以下错误:
线程“main”java.util.InputMismatchException中出现异常
位于java.util.Scanner.throwFor(Scanner.java:864)
下一步(Scanner.java:1485)
位于java.util.Scanner.nextInt(Scanner.java:2117)
位于java.util.Scanner.nextInt(Scanner.java:2076)
位于Huffman_Encoder.main(Huffman_Encoder.java:26)
i、 例如,行:int n=in.nextInt()代码>正在引发异常。我不知道为什么会这样。根据我对扫描仪定界符的理解,我应该跳过冒号,因此int n=in.nextInt()
应将冒号后面的值放入n
我在这里看不到什么
操作系统是Windows10,如果这很重要的话。多谢各位
edit:在进一步测试后,我发现错误发生在String t=in.next()之后代码>
在显示“A”之后立即打印出t
,然后程序在int n=in.nextInt()处抛出其异常代码>扫描仪获得的实际输入是以下字符串:
A:3\nB:1\nC:2\nD:2
因此,快速修复方法是将\n
添加到分隔符列表中:
Scanner in = new Scanner(file).useDelimiter("[:\n]");
但是,这可能不是严格正确的,因为这将接受任何在字母和数字之间带有冒号或换行符的流,例如:
A
3:B
4
因此,最好逐行读取输入并在冒号处拆分(请参见String.split()
)。在访问Scanner之前。next**()方法建议使用适当的Scanner.hasNext**()方法。如果需要整数,请使用Scanner.hasNextInt()检查下一个标记,并通过Scanner.nextInt()获取它
在这里,您已经使用Scanner.hasNextLine()检查了下一个标记,该标记表示输入中至少还有一行。但是您正在尝试使用Scanner.next()和Scanner.nextInt()访问下一个令牌 我自己,我会使用带有默认分隔符的扫描仪读取每一行,然后使用“:”
拆分行,但是如果您当前使用,您将无法像您应该的那样处理空白。感谢您的洞察力,我没有发现换行符可能是一个问题。但是,你提到的修复方法对我不起作用。我已经对此进行了测试,在第一个字符串t=in.next()之后,我的程序立即停止工作;我相信现在的情况是冒号被读入n,但这不应该发生。是的,正如我所说,这不是一个健壮的解决方案。更好的方法是逐行读取文件并在冒号上拆分。拆分的替代方法可以是这样的regexp([a-Z]+):([0-9]+)