Java 8控制台应用如何正确读取多行粘贴输入?
Java 8控制台多行粘贴输入问题解决方法
你的核心问题出在使用了错误的Scanner读取方法,以及对输入结束条件的处理不当,下面是具体解决方案:
问题根源
- 你用的
sc.next()是按「空白字符(空格、换行、制表符)」分割内容,不是按行读取,会把行内空格拆成多个元素,且无法正确识别无换行结尾的最后一行。 sc.hasNext()判断的是是否存在下一个分割标记,而非下一行,导致粘贴后程序会一直等待输入,直到你按回车或终止键。
正确解决方案
方案1:按行读取 + 系统终止键结束
使用sc.nextLine()读取整行,配合hasNextLine()判断,粘贴后按系统特定终止键结束输入:
import java.util.ArrayList; import java.util.Scanner; public class MultiLineInput { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("粘贴内容后,按 Ctrl+D(Linux/macOS) 或 Ctrl+Z(Windows) 结束输入:"); ArrayList<String> inputLines = new ArrayList<>(); while (sc.hasNextLine()) { String line = sc.nextLine(); inputLines.add(line); } sc.close(); // 处理读取到的行(这里用打印示例) System.out.println("\n读取到的内容:"); inputLines.forEach(System.out::println); } }
操作步骤:粘贴所有行 → 直接按终止键,程序会立刻处理包括最后一行在内的所有内容。
方案2:按行读取 + 空行结束
如果不想记系统终止键,可以约定输入空行作为结束信号,粘贴后按一次回车即可:
import java.util.ArrayList; import java.util.Scanner; public class MultiLineInput { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("粘贴内容后,按回车输入空行结束:"); ArrayList<String> inputLines = new ArrayList<>(); String line; // 读取到空行时停止循环 while (!(line = sc.nextLine()).isEmpty()) { inputLines.add(line); } sc.close(); // 处理读取到的行 System.out.println("\n读取到的内容:"); inputLines.forEach(System.out::println); } }
操作步骤:粘贴所有行 → 按一次回车(输入空行),程序自动结束读取并输出内容。
注意事项
- 不要用
sc.next()处理多行文本,除非你确实需要按空格分割内容。 - 控制台输入本身是流式的,程序无法自动识别「粘贴完成」,必须通过终止键或约定标记来结束输入。
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

