如何通过Scanner.useRadix()在读取控制台输入时自动识别并解析十六进制或二进制数据?

2026-04-30 17:011阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计581个文字,预计阅读时间需要3分钟。

如何通过Scanner.useRadix()在读取控制台输入时自动识别并解析十六进制或二进制数据?

使用Scanner类的useRadix方法可以自动按指定进制解析输入的整数,无需手动调用parseInt方法。此功能只影响具有进制感知的方法,如nextByte、nextInt、nextLong等,对next或nextLine方法无效。必须在读取前设置。

设置进制后直接读取十六进制数

调用 useRadix(16) 后,nextInt() 会把输入(如 "FF"、"a1"、"0x1F")当作十六进制解析——注意:Scanner 默认不识别 "0x" 前缀,输入需为纯十六进制数字(如 "FF"),否则抛出 InputMismatchException。

  • 正确输入示例:FF → 解析为 255;dead → 解析为 57005
  • 错误输入示例:0xFF0x1A 会失败,因为 Scanner 不跳过 "0x"
  • 使用前务必检查输入合法性,或用 try-catch 捕获异常

读取二进制数据需显式设为 radix=2

二进制同理,调用 useRadix(2) 后,nextInt() 只接受由 '0' 和 '1' 组成的字符串:

  • 输入 1010 → 解析为 10
  • 输入 11020b101 会报错(含非法字符或前缀)
  • 若用户习惯输 "0b...",建议先用 next() 读字符串,再手动截掉前缀后 parseInt

进制设置是 Scanner 实例级别的,需按需重置

同一个 Scanner 对象多次读取不同进制数据时,必须每次读取前调用 useRadix() 切换:

  • 比如先读一个十六进制数:scanner.useRadix(16); int hex = scanner.nextInt();
  • 再读一个十进制数:scanner.useRadix(10); int dec = scanner.nextInt();
  • 忘记重置会导致后续读取仍按旧进制解析,极易出错

实用小技巧:封装带进制提示的输入方法

为提升用户体验和健壮性,可封装工具方法:

  • 打印提示如 "请输入十六进制数(不含 0x):",再调 useRadix(16) + nextInt()
  • 捕获 InputMismatchException 并提示格式错误,然后 scanner.nextLine() 清空错误输入行
  • 读完后主动恢复默认进制(radix=10),避免影响后续逻辑

本文共计581个文字,预计阅读时间需要3分钟。

如何通过Scanner.useRadix()在读取控制台输入时自动识别并解析十六进制或二进制数据?

使用Scanner类的useRadix方法可以自动按指定进制解析输入的整数,无需手动调用parseInt方法。此功能只影响具有进制感知的方法,如nextByte、nextInt、nextLong等,对next或nextLine方法无效。必须在读取前设置。

设置进制后直接读取十六进制数

调用 useRadix(16) 后,nextInt() 会把输入(如 "FF"、"a1"、"0x1F")当作十六进制解析——注意:Scanner 默认不识别 "0x" 前缀,输入需为纯十六进制数字(如 "FF"),否则抛出 InputMismatchException。

  • 正确输入示例:FF → 解析为 255;dead → 解析为 57005
  • 错误输入示例:0xFF0x1A 会失败,因为 Scanner 不跳过 "0x"
  • 使用前务必检查输入合法性,或用 try-catch 捕获异常

读取二进制数据需显式设为 radix=2

二进制同理,调用 useRadix(2) 后,nextInt() 只接受由 '0' 和 '1' 组成的字符串:

  • 输入 1010 → 解析为 10
  • 输入 11020b101 会报错(含非法字符或前缀)
  • 若用户习惯输 "0b...",建议先用 next() 读字符串,再手动截掉前缀后 parseInt

进制设置是 Scanner 实例级别的,需按需重置

同一个 Scanner 对象多次读取不同进制数据时,必须每次读取前调用 useRadix() 切换:

  • 比如先读一个十六进制数:scanner.useRadix(16); int hex = scanner.nextInt();
  • 再读一个十进制数:scanner.useRadix(10); int dec = scanner.nextInt();
  • 忘记重置会导致后续读取仍按旧进制解析,极易出错

实用小技巧:封装带进制提示的输入方法

为提升用户体验和健壮性,可封装工具方法:

  • 打印提示如 "请输入十六进制数(不含 0x):",再调 useRadix(16) + nextInt()
  • 捕获 InputMismatchException 并提示格式错误,然后 scanner.nextLine() 清空错误输入行
  • 读完后主动恢复默认进制(radix=10),避免影响后续逻辑