You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

对你之前尝试的分析

  1. 替换换行符没用:因为nextLine()只读到第一个换行就停了,后续内容根本没进text变量里,自然找不到换行符可替换。
  2. 看不懂的那段代码: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();
  1. 指定行数的循环:既然不符合任务要求,上面两个方案都不需要提前知道行数,更贴合你的需求。

内容的提问来源于stack exchange,提问作者20GoodMen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:23:29