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
答案 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()方法来获取字符串的标记。然后,您可以自己将字符转换为字节。