Java中如何获取经退格编辑后的正确字符串输入?
问题原因
- 输入阶段:你当前使用的运行环境(多为IDE集成控制台、未开启规范行编辑的终端)不会在输入时预处理退格操作,只是将退格控制符(
\b,ASCII码值为8)写入输入流,同时终端渲染时将退格操作展示为删除了前面的Lion内容,你视觉上看到的输入只有Tiger,但实际输入流的完整原始内容为Lion\b\b\b\bTiger。 - 代码处理阶段:
Scanner.nextLine()只会读取输入流中从当前位置到换行符的全部原始字符,不会主动处理退格控制符。如果输出环境也不支持退格符的渲染删除,就会直接展示为Lion拼接Tiger的结果。 - 额外问题:你每次调用输入方法都新建
Scanner实例,多个Scanner共享System.in输入流时可能出现缓冲异常,也会引发输入内容异常。
解决方案
方案1:代码层面兼容所有运行环境
全局复用同一个Scanner实例,同时新增退格符处理逻辑,手动解析得到编辑后的正确内容:
import java.util.Scanner; public class StringInputTest { // 全局复用同一个Scanner,避免输入流缓冲异常 private static final Scanner GLOBAL_SCANNER = new Scanner(System.in); public static String takeStringInput(){ return GLOBAL_SCANNER.nextLine(); } private static String processBackspace(String rawInput) { StringBuilder result = new StringBuilder(); for (char c : rawInput.toCharArray()) { if (c == '\b') { // 遇到退格符时删除前一位字符 if (result.length() > 0) { result.deleteCharAt(result.length() - 1); } } else { result.append(c); } } return result.toString(); } public static void main(String[] args) { System.out.println("Enter Name"); String rawInput = takeStringInput(); String processedInput = processBackspace(rawInput); System.out.println("Entry is :"); System.out.println(processedInput); } }
方案2:更换运行环境
直接使用操作系统原生终端(Windows的cmd、PowerShell,Linux/macOS的Terminal)运行代码,原生终端默认开启标准行编辑模式,会在输入阶段就处理退格操作,直接将编辑后的内容传递给Java程序,不需要额外处理退格符。
内容的提问来源于stack exchange,提问作者palash
相关产品推荐
相关产品推荐

