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()、実際に期待されるのは数値のテキスト表現です。たとえば、「b」の代わりに「98」があった場合、98 がそのバイト変数に読み込まれます。

于 2012-06-22T09:55:10.257 に答える
0

Scannerテキストの解析に使用される場合、このScanner#nextByte()メソッドは、数字 (符号付きまたは符号なし) で構成される入力を照合して、同等の 1 バイト値に変換しようとします。

逆ではなく、文字を読み取らず、バイト値を返します。

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 に答える