Java中如何用Scanner读取控制台的多行段落输入?
Java读取多行粘贴文本的解决办法
核心问题原因
你遇到的情况是因为Scanner.nextLine()默认以换行符作为结束标记,粘贴多行文本时,控制台会把第一个换行符识别成手动回车,导致nextLine()只读取第一行就停止了。下面给你几个实用的解决方法:
方案1:一次性读取所有输入(推荐用于粘贴场景)
直接把Scanner的分隔符设置为输入结束符(EOF),这样它会读取所有粘贴的内容,直到你按下结束快捷键(Linux/macOS按Ctrl+D,Windows按Ctrl+Z)。
代码示例:
import java.util.Scanner; public class DecryptApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 设置分隔符为输入结束位置,一次性读取全部内容 scanner.useDelimiter("\\Z"); // 读取所有输入,包括所有换行 String fullEncryptedText = scanner.next(); scanner.close(); // 调用你的解密方法 String decryptedResult = decrypt(fullEncryptedText); System.out.println(decryptedResult); } // 这里替换成你自己的解密方法 private static String decrypt(String encrypted) { // 示例:简单字符交换逻辑,替换成你的实际代码 char[] chars = encrypted.toCharArray(); for (int i = 0; i < chars.length - 1; i += 2) { char temp = chars[i]; chars[i] = chars[i+1]; chars[i+1] = temp; } return new String(chars); } }
方案2:按空行结束输入
如果不想用快捷键,也可以循环读取每一行,直到你输入空行(直接按回车)就停止,适合手动输入+粘贴的混合场景:
import java.util.Scanner; import java.util.StringJoiner; public class DecryptApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 用系统默认换行符拼接所有行 StringJoiner textJoiner = new StringJoiner(System.lineSeparator()); String inputLine; // 只要输入的行不是空的,就继续读取 while (!(inputLine = scanner.nextLine()).isEmpty()) { textJoiner.add(inputLine); } scanner.close(); String fullEncryptedText = textJoiner.toString(); String decryptedResult = decrypt(fullEncryptedText); System.out.println(decryptedResult); } private static String decrypt(String encrypted) { // 你的解密逻辑 char[] chars = encrypted.toCharArray(); for (int i = 0; i < chars.length - 1; i += 2) { char temp = chars[i]; chars[i] = chars[i+1]; chars[i+1] = temp; } return new String(chars); } }
对你之前尝试的分析
- 替换换行符没用:因为
nextLine()只读到第一个换行就停了,后续内容根本没进text变量里,自然找不到换行符可替换。 - 看不懂的那段代码:
scanner.useDelimiter("\n")是把换行设成分隔符,forEachRemaining会遍历所有读取到的行。如果要把这些行拼成完整文本,可以改成这样:
Scanner scanner = new Scanner(System.in); scanner.useDelimiter("\n"); StringBuilder sb = new StringBuilder(); // 把每一行拼起来,保留换行 scanner.forEachRemaining(line -> sb.append(line).append("\n")); String fullText = sb.toString(); scanner.close();
- 指定行数的循环:既然不符合任务要求,上面两个方案都不需要提前知道行数,更贴合你的需求。
内容的提问来源于stack exchange,提问作者20GoodMen
相关产品推荐
相关产品推荐

