4
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
4

3 回答 3

5

java.util.Scanner用于扫描文本

因此,当您调用 时Scanner#nextByte(),它真正期望找到的是数字的文本表示。例如,如果那里有“98”而不是“b”,它会将 98 读入该字节变量。

于 2012-06-22T09:55:10.257 回答
0

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

不是相反,它不会读取一个字母并返回他的字节值。

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

"(([-+]?(((((?i)[0123456789]|\p{javaDigit})++)|(\p{javaDigit}&&[^0]?((?i)[0123456789] |\p{javaDigit})?(\ ((?i)[0123456789]|\p{javaDigit})((?i)[0123456789]|\p{javaDigit})((?i)[0123456789]|\ p{javaDigit}))+)))))|(((((?i)[0123456789]|\p{javaDigit})++)|(\p{javaDigit}&&[^0]?((? i)[0123456789]|\p{javaDigit})?(\ ((?i)[0123456789]|\p{javaDigit})((?i)[0123456789]|\p{javaDigit})((?i) [0123456789]|\p{javaDigit}))+)))|(\Q-\E((((?i)[0123456789]|\p{javaDigit})++)|(\p{javaDigit}&& [^0]?((?i)[0123456789]|\p{javaDigit})?(\((?i)[0123456789]|\p{javaDigit})((?i)[0123456789]|\p{ javaDigit})((?i)[0123456789]|\p{javaDigit}))+)))"

所以你在那里看到它只寻找数字。

于 2012-06-22T10:16:43.037 回答
-1

nextByte 的 JavaDoc 说:

如果下一个标记与上面定义的整数正则表达式匹配,则该标记被转换为字节值

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

于 2012-06-22T09:47:12.140 回答