【问题标题】:Java - How to Input Multiple Lines of Text In One InputJava - 如何在一个输入中输入多行文本
【发布时间】:2020-03-09 18:39:46
【问题描述】:

我目前正在用 Java 编写一个程序,我需要从用户那里获取输入,这是一段文本。但是,我需要用户能够一次输入多段文本。这可以通过在程序提示输入时简单地粘贴整个文本来实现。我正在使用扫描仪进行输入,当我将多个段落粘贴到输入中时,不会抛出任何错误,但是每当我打印出存储文本的变量时,只有第一部分(在第一个换行符之前)是输出。如何在不提示用户为每个文本块单独输入的情况下存储具有多个换行符的整段文本?

我已经有一些代码,但它不能处理多行:

import java.util.*;

public class ReWrite {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please paste the essay to be re-written >> ");
    String originalEssay = scanner.nextLine();
    System.out.println(originalEssay);
    System.out.println("I hope that was your essay...");
  }
}

【问题讨论】:

标签: java input line-breaks


【解决方案1】:

您需要有一种方法让用户在他完成输入数据时进行指示。

在此之前,获取最新的输入行并保存。从一个空字符串开始并附加输入的每一行文本,直到用户用一些预先确定的字符集指示他完成了。

【讨论】:

  • 这就是 control-D 的用途。输入结束。
  • EOF(文件结尾)字符是许多可能性中的一种。 Contol-D 取决于平台。
  • Ctrl-D 或 EOF 如果用户必须回答多个问题,每个问题都有多行,则不是解决方案。
  • 例如,您可以告诉用户在完成时输入以下行:DONE。然后检查每一行,看看它是否 .equals("DONE")。如果是,请停止。如果不是,则将该行附加到您的累积字符串值中,然后读取下一行。
  • 谢谢,这是我现在一直在尝试的方法 - 我认为您的想法似乎可行,但该程序还有一些其他问题妨碍了完整功能。谢谢!
【解决方案2】:

通常您不应尝试从命令行输入整段文本。但是,如果您想阅读如此大的文本,则可以使用BufferedReader 并简单地阅读直到流结束。遇到 EOF 时到达流的末尾。在许多系统上,可以通过按 Control-D 来生成 EOF(但您可能希望向用户表明这一点)。

使用这种通用方法的一大优势是,您还可以使用各种操作系统提供的实用程序将文件通过管道传输到您的应用程序中。

一个缺点是,将它与Scanner 混合不是一个好主意;显然扫描仪在 EOF 之后是无用的,在文本之前使用它可能意味着扫描仪检索到部分文本。关闭扫描仪也将关闭它所连接的输入流。扫描器通常必须向前看才能看到令牌在哪里结束,并且它可能必须读入文本才能这样做。

StringBuilder sb = new StringBuilder();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
    CharBuffer buffer = CharBuffer.allocate(1024);

    while (reader.read(buffer) != -1) {
        buffer.flip();
        sb.append(buffer);
        buffer.clear();
    }
}
System.out.printf("Read %d characters", sb.length());

我没有提供字符编码。对于此类应用程序,平台字符编码应该就可以了。

【讨论】:

  • 谢谢 - 我需要研究 BufferedReader 才能完全理解代码,尽管据我所知,这似乎是我正在寻找的。​​span>
【解决方案3】:
import java.util.*;

public class ReWrite {
    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);

        System.out.println("Please paste the essay to be re-written >> ");

        String originalEssay = "";

        System.out.println();

        while(scanner.hasNextLine()){
             originalEssay += scanner.nextLine();
             originalEssay += "\n";
        }

        System.out.println(originalEssay);
        System.out.println("I hope that was your essay...");
    }
}

您需要上述程序。您需要确保您正在检查输入中是否有任何其他“行”。您可以使用 hasWhileNext() 来执行此操作。希望这会有所帮助!

【讨论】:

  • 感谢@spinyBabbler - 带有 hasNextLine 条件的 while 循环是我刚刚尝试使用的,尽管我现在无法在不使用 CTRL-D 之类的命令的情况下让程序停止输入行,退出程序。我假设这就是您使用“hasWhileNext()”的意思——它是如何工作的?
【解决方案4】:

您需要某种方式来了解用户是否已完成输入。我用 THE-END 作为标记做了一个小例子(是的,不是原始的吗?)

import java.util.Scanner;

public class DocReader {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder strBuilder = new StringBuilder();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (!line.equals("THE-END")) {
                strBuilder.append(line + System.lineSeparator());
            } else {
                break;
            }
        }
        System.out.println(strBuilder.toString());
        scanner.close();
    }
}

这在末尾添加了一个额外的行分隔符,如果需要,很容易解决这个问题。使用多个中断作为结束标记可能会更好(一些基于文本的协议会这样做),例如用户按 Enter 3 次。这意味着它们不能有两个空行,因此非常依赖于用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多