当前位置: 首页 > 知识库问答 >
问题:

Java中的多行控制台输入

易超
2023-03-14

我有一些多行文字作为控制台输入。诸如此类:

first string with some text
second string with another text
third text with its own text

行数可能每次都不同(一、二、三、四等,但不是零),但这个文本总是在瞬间用行分隔符(一个粘贴,而不是按回车键输入几个)输入。这个Java应用程序必须立即开始对这些行做些什么,但出于某种原因,我不明白如何做出这种行为。我的意思是,它必须将所有这些行保存到String,或String[],或List

当然,我试着用扫描仪,但我找不到有效的解决方案。它要么只给我第一行,要么它不明白,最后一行就是等待下一个输入的最后一行。


共有1个答案

姜旭
2023-03-14

我可以想到两种方法让扫描仪停止等待输入,并将整个字符串保存为输入。

第一种方法是将文本输入控制台,按Enter键,然后按CTRL-D键,这将添加一个尾行字符。此结束行字符将构成扫描仪。hasNextLine()方法返回false,因此它将停止等待输入。代码非常简单:

Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
while (scanner.hasNextLine()) {
    sb.append(scanner.nextLine()).append("\n");
}
sb.deleteCharAt(sb.length() - 1); // delete the last \n character
String s = sb.toString();

使用这种方法,即使您的输入是一个完整的多行字符串,也会使用扫描仪逐行读取。nextLine()方法。每一行都将附加到StringBuilder,再加上一个换行符\n以保留原始输入。如你所见,我很容易地将sb转换成字符串s。

StringBuilder是推荐的由多个部分组成字符串的方法,因为它是可变的,所以你不会像使用不可变的字符串一样一直创建副本:

s += scanner.nextLine() + "\n"; // new copy created and assigned to s

第二种方法不需要CTRL D,与第一种方法非常相似。另外,每一行输入都会被检查,看它是否为空。isEmpty()方法。如果它是空的,则只需中断while循环,而不将该行附加到sb:

Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.isEmpty()) {
        break;
    } // else
    sb.append(line).append("\n");
}
sb.deleteCharAt(sb.length() - 1); // delete the last \n character
String s = sb.toString();

现在,如果输入中包含空行(如段落之间的分隔符),这种方法显然不起作用,因为它将停止在那里,而字符串的其余部分将被忽略。但是,您可以决定一个停止字符,并检查该行是否以它开头,而不是if(line.isEmpty())。如果是,请中断:

if (line.startsWith("&")) { 
    break;
}

同样,这个角色不会包含在你的sb中。祝你好运!

 类似资料:
  • 问题内容: 通过控制台进行任何输入的数据类型(如我使用BufferedReader类所做的那样)为String。之后,我们将其类型转换为需要查询的数据类型(如Inter.parseInt()为整数)。但是在C语言中,我们可以接受任何输入原始数据类型,而在Java中,所有输入类型都是Neccerily String。为什么是这样? 问题答案: 控制台输入实际上以一系列字节而不是字符串的形式读入。这是

  • 问题内容: 我最近切换到了sublime text 2,但是我似乎找不到任何允许我在编辑器中实现Java控制台输入的插件/资源。我设法使其能够编译和执行Java文件,但是只要我的代码需要任何输入(例如扫描仪输入),该代码就不会编译,并且会出现错误。 我已经看到了解决方案,可以在python上实现这一目标,但还没有设法在Java上找到任何东西。 问题答案: 好的,我已经找到了解决此“在Sublime

  • 问题内容: 如果我有多个go例程,并且其中两个或两个以上例程决定需要打印某些内容,那么它们是否可能彼此中断? 例如: 是否有可能一个常规程序开始打印(),而另一个常规程序中断()和原始装订()? 我尝试自己运行它并检查输出,它 看起来 不错,但是如何确定? 问题答案: 是的,有可能,尽管GOMAXPROCS = 1不会显示任何内容。当使用更多goroutine,更大的行和更多的线程运行时,它们将显

  • 问题内容: 程序应在中列出卷。 例如:我从vollist.java类获得此输出。 控制台输出: 如何在我的控制台中获得此控制台输出。 那只会显示row1-> vol1 row2-> vol1 ............如何获得类似于控制台row1-> vol1 row2-> vol2的输出(计数) 问题答案: 定义并实现您的TableModel(在这种情况下,扩展AbstractTableModel

  • 问题内容: 我一直在尝试从Java应用程序中检索“ unicode用户输入”,以获得一个小的实用程序片段。问题是,它似乎在“开箱即用”的Ubuntu上运行,我猜它在UTF-8上具有操作系统范围的编码,但是从“ cmd”运行时在Windows上不起作用。考虑的代码如下: 在Ubuntu上的输出(不对配置进行任何更改): 在Windows CMD提示符下输出(绝不受JAVA_TOOL_OPTIONS影

  • 我最近在我的应用程序中安装了Firebase pods,因为我希望现在能够检查用户并允许用户注册。 但是,这是控制台中的内容: 2016-09-27 22:45:50.248 样本应用[68417:] 火垒分析 v.3402000 开始 2016-09-27 22:45:50.260785 样本应用[68417:3132777] 子系统: com.apple.libsqlite3, 分类: 日志记