Java中Scanner的useRadix()可动态设置输入解析进制,nextInt()据此自动将字符串转为十进制整数;支持2/8/10/16进制,需配合hasNextInt()预检,且radix仅影响数值读取方法。

Java 中 Scanner 类的 radix(进制基数)配置,可以配合 while 循环直接读取并自动转换不同进制的整数字符串(如二进制、八进制、十六进制),无需手动解析。关键在于:用 scanner.useRadix(int radix) 设置当前输入解析进制,再调用 nextInt() 等方法——它会按设定进制解释输入的数字字符串。
设置 radix 后 nextInt() 自动按指定进制解析
Scanner 的 nextInt() 不是“读十进制再转”,而是根据当前 radix 解释输入的字符序列。例如:
- 设
useRadix(2),输入"1010"→ 解析为十进制10 - 设
useRadix(16),输入"FF"→ 解析为十进制255 - 设
useRadix(8),输入"17"→ 解析为十进制15
用 while 循环持续读取,支持动态切换进制
可在循环中根据用户输入或预设规则随时调用 useRadix() 切换解析方式。例如让用户先输入进制,再输入数字:
<font color="#888">// 示例:交互式读取任意进制整数
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
System.out.print("请输入进制(2/8/10/16): ");
if (!sc.hasNextInt()) {
System.out.println("非法进制,退出");
break;
}
int base = sc.nextInt();
if (base != 2 && base != 8 && base != 10 && base != 16) {
System.out.println("仅支持 2、8、10、16 进制");
continue;
}
sc.useRadix(base); // 关键:设置当前解析进制
System.out.print("请输入该进制下的数字: ");
if (sc.hasNextInt()) {
int value = sc.nextInt(); // 按 base 进制解析,返回十进制 int
System.out.printf("解析结果(十进制): %d%n", value);
} else {
System.out.println("输入不符合该进制格式");
sc.next(); // 清除非法输入
}
}</font>
注意事项与常见问题
-
radix 只影响 nextInt()、nextLong() 等数值读取方法,不影响
next()或nextLine();后者始终读原始字符串 -
每次调用 useRadix() 都会覆盖前值,所以需在每次
nextInt()前确保已设好所需进制 -
十六进制输入不区分大小写,
"aF"和"AF"均可;但不能带0x或0b前缀(否则抛InputMismatchException) -
若输入含非法字符(如二进制里出现 '2'),
nextInt()会跳过并等待下一次有效输入,建议配合hasNextInt()预检
扩展:批量读取固定进制数据(如文件中全是十六进制)
若全部数据统一进制,只需在循环外设一次 radix:
<font color="#888">// 从字符串流读取多个十六进制数
String input = "FF 1A 7B";
Scanner sc = new Scanner(input);
sc.useRadix(16);
while (sc.hasNextInt()) {
System.out.println(sc.nextInt()); // 输出 255, 26, 123
}</font>
不复杂但容易忽略:radix 是 Scanner 的状态属性,不是 parse 方法的参数。理解这一点,就能灵活驱动 while 循环处理多进制混合输入。










