java.util.Scanner能否读取粘贴文本?粘贴后报InputMismatchException如何解决?
命令行Ctrl+V的作用机制
Ctrl+V在命令行中的本质是将剪贴板存储的所有文本内容按原始格式批量写入标准输入流(stdin),和用户手动逐字符输入的效果完全一致,程序侧无法区分输入内容是粘贴生成还是手动录入。如果剪贴板内容包含换行符,写入stdin时会等效于用户按下回车,触发按行读取的接口立即返回。
粘贴后触发异常的原因
该异常和粘贴操作无关,是代码中Scanner的调用逻辑不符合多行长文本的读取场景导致的:
- 你需要读取的多份XML包含大量换行符,
read.nextLine()单次调用只会读取到第一行末尾的换行符为止,剩余的所有XML内容会全部残留在输入缓冲区中。 - 代码后续执行
read.nextInt()时,会尝试从缓冲区的剩余内容中解析整数,但剩余内容都是XML文本,完全不匹配整数格式,因此直接抛出InputMismatchException。你看到的“直接跳到nextInt步骤”,本质是nextLine()快速读完了第一行内容,剩余内容无法被解析为整数触发报错。
Scanner读取粘贴文本的可行性
Scanner完全可以正常读取粘贴的文本,只需调整读取逻辑适配多行内容即可。nextLine()是按行读取的接口,单次调用只能获取单行内容,要读取完整的多行XML,你可以自定义分隔符来标记内容输入结束,修改后的参考代码如下:
import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Scanner; public class Encoder { public static void main(String[] args) { Scanner read = new Scanner(System.in); // 自定义分隔符:用户粘贴完内容后输入---end并回车,即代表内容结束 read.useDelimiter("---end\\R"); int option = 0; while (option != 1) { System.out.println("请粘贴文本,结束后输入---end并回车:"); String content = read.next(); byte[] bytes = content.getBytes(StandardCharsets.UTF_8); content = Base64.getEncoder().encodeToString(bytes); System.out.println("\nBase64编码结果:"); System.out.println(content); System.out.println("\n0. 再次编码"); System.out.println("1. 关闭程序"); option = read.nextInt(); // 清空读取选项后残留的换行符 read.nextLine(); } read.close(); } }
内容的提问来源于stack exchange,提问作者CharlieWhisky
相关产品推荐
相关产品推荐

