Java-Scanner无法使用nextByte()

时间:2012-06-22 09:14:05

标签: java

Scanner Sc = new Scanner(new File("Input.bin"));
String s = Sc.nextLine();
fsize = Integer.parseInt(s); // Reads 4

s = Sc.nextLine();
int mapSize = Integer.parseInt(s);     // Reads 3 
for (int i = 0; i < mapSize; i++)
{
    byte value = 0;
    value = Sc.nextByte();  // Here it is throwing the exception it should have
                            // print the ascii of 'b' which is 98????

    String key = Sc.nextLine();
    key = key.trim();

    dcMap.put(key, (char)value);
 // System.out.println(key + " " + (char)value);
}

Input.bin 文件内容:

4
3
b 0
c 10
a 11

3 个答案:

答案 0 :(得分:4)

java.util.Scanner用于扫描文本

因此,当您致电Scanner#nextByte()时,它真正希望找到的是一个数字的文本表示。例如,如果你有“98”而不是“b”,那么它就会将98读入该字节变量。

答案 1 :(得分:0)

Scanner用于解析文本Scanner#nextByte()方法尝试匹配由数字(有符号或无符号)组成的输入,以便将其转换为等效的单字节值。

不是相反,它不会读取字母并返回其字节值。

如果您想知道Scanner尝试匹配的内容,请查看方法hasNextByte()(检查是否可以读取字节)。它试图匹配这种模式:

  

“(([ - +](((((ⅰ)[0123456789] | \ p {javaDigit})++)|(\ p {javaDigit}&安培;&安培; [^ 0]((???? ?ⅰ)[0123456789] | \ p {javaDigit})(\((Ⅰ')[0123456789] | \ p {javaDigit})[0123456789](第(i?)|?\ p {javaDigit})((ⅰ )[0123456789] | \ p {javaDigit}))+)))))|(((((ⅰ)[0123456789] | \ p {javaDigit})++)|(\ p {javaDigit}&安培;?&安培;????[^ 0](?(I)[0123456789] | \ p {javaDigit})(\((ⅰ)[0123456789] | \ p {javaDigit})((I)[0123456789] | \ p {javaDigit})((Ⅰ')[0123456789] | \ p {javaDigit}))+)))|(\ Q- \ E((((ⅰ)[0123456789] | \ p {javaDigit})++ )|(\ p {javaDigit}&安培;&安培;?[^ 0]((ⅰ)[0123456789] | \ p {javaDigit})?(\((ⅰ)[0123456789] | \ p {javaDigit}) (?(ⅰ)[0123456789] | \ p {javaDigit})((I)[0123456789] | \ p {javaDigit}))+)))“

所以你看到它只查找数字。

答案 2 :(得分:-1)

nextByte的JavaDoc说:

  

如果下一个标记与上面定义的整数正则表达式匹配   然后将令牌转换为字节值

所以它期望一个整数标记作为一个字符串,然后转换成一个字节。尝试使用next()方法来获取字符串的标记。然后,您可以自己将字符转换为字节。