有没有“scanner.newLine();”之类的东西可以读取控制台输入多行段落吗?

问题描述 投票:0回答:1

TLDR:我想将多行段落粘贴到控制台中(在方法中使用),但由于 .nextLine() 它只将第一行放入字符串变量中并忽略其余部分。

大家好, 我对 Java 还很陌生,刚刚完成了基础知识。我对术语还是有点不懂。我的任务是一个“解密器”方法,它采用“加密”段落,在方法中交换字母,并打印出“解密”版本:我的解密方法工作得很好。

问题是用户输入:我需要将“加密”的 7 行段落放入控制台,它应该返回“解密”的 7 行段落。我用过scanner.nextLine();这显然不起作用。一旦出现换行符,扫描仪就会停止读取。 (我还注意到,如果您将多行文本/段落复制粘贴到控制台中,控制台会将第一个换行符视为“Enter-Press”)

我确实没有找到任何适合我的问题的解决方法。理想的情况是存在一个scanner.newLine()。 再说一次,我经验不足,现在深感困惑和有点沮丧:,D

首先我尝试通过删除“来删除换行符 ” “ ” “ ”并将其替换为“”

String text = scanner.nextLine();
        text = text.replaceAll("\n","");

这不起作用,因为无论如何,初始输入都只能读取到第一个换行符,因此“文本”中没有任何内容可以替换。 我尝试了一些可疑的语法,例如“scanner.replaceAll(” ","").nextLine();"这更是一种绝望的行为。

有一个我真的不明白:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    scanner.useDelimiter("\n");
    scanner.forEachRemaining(System.out::println);

我还发现了“输入要输入多少行”的循环方法,效果很好,但这不是任务的意义。

java text methods console java.util.scanner
1个回答
0
投票

为了给您提供正确的背景,首先解释一些事情:

System.in
实际上不是键盘。它是“进程的标准输入”,可以是任何东西。它只是“默认情况下”“无论用户输入什么”。例如,java com.foo.MyApp <foo.txt 现在将
System.in
设置为文件
foo.txt
的内容。包括它可以“用完”的概念(键盘永远不会)。
因此,当您写

nextLine()

时,这与告诉扫描仪不同:请获取所有内容,直到用户按下回车键。

不,它是:获取所有内容,直到流中出现换行符号。 if 

System.in

是键盘,获取换行符的一种方法是按 Enter 键。另一种方法是按 CMD+V 或任何用于将数据粘贴到终端的方法,并且该数据包含换行符。 Scanner 实际上无法区分这两件事。因此,没有方法可以走:“获取所有文本,直到用户按回车键”。因为这个方法如何发挥作用呢? Enterpress 看起来与粘贴数据中的换行符相同。 “好吧,这就是我想要输入的所有内容,请继续处理它”的信号需要成为数据的一部分。如果它不是“换行符”(因为您想捕获多段落的内容),那么您将不得不想出其他东西。

另外,
nextLine()
是一个你永远不应该使用的坏方法。它的功能完全符合其规格说明,但实际情况并非您所想象的那样。相反,这是毫无用处的东西。扫描仪将尽职尽责地继续让

nextLine()

成为这个无用的东西,与扫描仪上的所有其他

.next
操作进行各种令人惊讶的(阅读:不需要的)交互。
相反,如果您想要字符串输入,请使用 
.next()
,如果默认分隔符(即:任何空格,即如果您键入“Hello, World!”并按 Enter 键,则第一个“标记”为“你好,”第二个是“世界!”。如果您不想这样,请将分隔符设置为“换行符”。例如)。

考虑到这一点:

这是一种方法:

System.out.println("Paste your paragraph, then hit enter and type 'DONE' and hit enter again:"); scanner.useDelimiter("(?i)\\RDONE\\R"); String data = scanner.next(); System.out.println("Your paragraph contains: " + data.length() + " symbols.");

这告诉扫描器“分隔每个输入标记的东西”是换行符,然后是文本 DONE,然后是换行符(各种操作系统使用不同的符号序列作为换行符,

\\R
涵盖了所有这些。
\n

可能也有效,但是

\\R
对所有东西都有效)。
(?i)
只是表示
DONE
部分不区分大小写。
.useDelimiter
的参数是一个正则表达式,它是它自己的迷你编程语言,用于描述常规语法,这就是为什么你可能会觉得很奇怪,你可以把

(?i)

放在那里,这意味着“不区分大小写” ' 不知何故。我们确实在这些字符串引号内压缩了一个小程序。

    

© www.soinside.com 2019 - 2024. All rights reserved.