получение многострочного текста с классом сканера в java

В части моего университетского проекта мне нужно получить текст с несколькими строками, а затем сохранить его в строке или массиве строк. Моя проблема в том, что в классе сканера с использованием методов получает только одну строку ввода. Поэтому я не могу получить другие линии. Пожалуйста, помогите мне.

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();
    }
}

}


person Kasra Ghavami    schedule 21.11.2014    source источник
comment
Цель вашей программы верна. То, как вы пытаетесь ввести многострочный ввод, неверно. Попробуйте прочитать из файла, написав: Scanner scanner = new Scanner(Paths.get(<file path in string here>));. Также используйте StringBuilder для добавления строк в b, поскольку String является неизменяемым, поэтому производительность будет снижена, если вы сделаете для него +=.   -  person Aman Agnihotri    schedule 21.11.2014
comment
Прости. я не понял, что ты имеешь в виду.   -  person Kasra Ghavami    schedule 21.11.2014


Ответы (2)


Вы можете попробовать использовать 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);
        }
    }
}
person Yohanes Khosiawan 许先汉    schedule 21.11.2014
comment
есть проблема с этим. В моей программе строки могут быть пустыми, а после них могут быть строки. таким образом, он просто сохраняет строку, пока не станет пустой строкой. - person Kasra Ghavami; 21.11.2014
comment
тогда вы можете просто указать любые другие символы, которые будут уникальными и никогда не будут встречаться в вашем вводе, и использовать их в качестве терминатора. вы также можете проверить это: stackoverflow.com/questions/16206813/, но вам нужно запустить его из терминала, а не из IDE. - person Yohanes Khosiawan 许先汉; 21.11.2014

Если вы создаете свою программу из командной строки, то вы можете использовать так называемое «перенаправление ввода». Вот как это работает:

Предположим, ваша программа:

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 < InputFile.txt

Если ваш InputFile.txt находится в другом каталоге, просто укажите полный путь, например:
java ScanningMultiline < "/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 ());
    }
}

Этот подход читает непосредственно из файла и помещает строки из файла в список String.

Другой подход

Вы также можете прочитать строки из файла и сохранить их в списке в одной строке, как показано в следующем фрагменте кода:

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));
    }
}

Йоханес Хосиаван ответил на другой подход, поэтому я не пишу его здесь.

person Aman Agnihotri    schedule 21.11.2014