【问题标题】:geting a multiline text with scanner class in java在java中使用扫描仪类获取多行文本
【发布时间】:2015-01-19 05:27:40
【问题描述】:

在我的大学项目的一部分中,我必须获取包含一些行的文本,然后将其保存在字符串或字符串数​​组中。我的问题是在扫描仪类中使用方法只能获取一行输入。所以我无法得到其他线路。请帮助我。

public class Main {
public static void main(String[] args) {
    java.util.Scanner a = new java.util.Scanner(System.in);
    String b = "";
    while (a.hasNextLine()) {
        b += a.nextLine();
    }
}

}

【问题讨论】:

  • 您的程序意图是正确的。您尝试提供多行输入的方式是错误的。尝试从文件中读取,方法是:Scanner scanner = new Scanner(Paths.get(<file path in string here>));。还可以使用StringBuilderb 中追加行,因为String 是不可变的,所以如果你对它执行+=,它会导致性能下降。
  • 对不起。我没明白你的意思。

标签: java multilinestring


【解决方案1】:

您可以尝试使用isEmpty 来检测仅限输入的输入。

更新

如果您的输入还包含一个空行,那么您可以指定另一个终止符;而不仅仅是一个空字符串。

public class Main {
    public static void main(String[] args) {
        //for example ",,"; then the scanner will stop when you input ",,"
        String TERMINATOR_STRING = ",,"

        java.util.Scanner a = new java.util.Scanner(System.in);
        StringBuilder b = new StringBuilder();
        String strLine;
        while (!(strLine = a.nextLine()).equals(TERMINATOR_STRING)) {
            b.append(strLine);
        }
    }
}

【讨论】:

  • 这有问题。在我的程序中,行可能是空的,后面可能有行。这样,它只会保存字符串,直到不是空行。
  • 那么您可以只指定任何其他唯一且永远不会出现在您的输入中的字符,并将其用作终止符。您可能还想检查一下:stackoverflow.com/questions/16206813/…,但您需要从终端而不是 IDE 运行它。
【解决方案2】:

如果您是从命令行构建程序,那么您可以使用一种称为“输入重定向”的东西。以下是它的工作原理:

假设你的程序是:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ScanningMultiline
{
    public static void main (String[] args)
    {
        List<String> lines = new ArrayList<> ();

        try (Scanner scanner = new Scanner (System.in))
        {
            while (scanner.hasNextLine ())
            {
                lines.add (scanner.nextLine ());
            }
        }

        System.out.println ("Total lines: " + lines.size ());
    }
}

现在假设您在文件中准备了程序的输入。

要编译程序,您需要将终端/命令提示符的当前目录更改为程序目录,然后写入:
javac ScanningMultiline.java

然后运行,使用输入重定向,例如:
java ScanningMultiline &lt; InputFile.txt

如果您的InputFile.txt 在另一个目录中,只需将其完整路径改为:
java ScanningMultiline &lt; "/Users/Xyz/Desktop/InputFile.txt"

另一种方法

您可以尝试直接从文件中读取输入。该程序的编写方式如下:

import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ScanningMultiline
{
    public static void main (String[] args)
    {
        final String inputFile = "/Users/Xyz/Desktop/InputFile.txt";

        List<String> lines = new ArrayList<> ();

        try (Scanner scanner = new Scanner (Paths.get (inputFile)))
        {
            while (scanner.hasNextLine ())
            {
                lines.add (scanner.nextLine ());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace ();
        }

        System.out.println ("Total lines: " + lines.size ());
    }
}

这种方法直接从文件中读取,并将文件中的行放在一个字符串列表中。

另一种方法

您可以从文件中读取行并将它们存储在单行的列表中,如下面的 sn-p 演示:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class ScanningMultiline
{
    public static void main (String[] args) throws IOException
    {
        final String inputFile = "/Users/Xyz/Desktop/InputFile.txt";

        List<String> lines = Files.readAllLines (Paths.get (inputFile));
    }
}

Yohanes Khosiawan 已经回答了一种不同的方法,所以我不在这里写那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多