2014-11-21 5 views
1

В части моего университетского проекта мне нужно получить текст с некоторыми строками, а затем сохранить его в строке или массиве строк. Моя проблема заключается в том, что в классе сканера с использованием методов получается только одна строка ввода. Поэтому я не могу получить другие строки. Помогите мне.Получение многострочного текста со сканирующим классом в 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(); 
    } 
} 

}

+0

Ваша цель программы правильная. Неправильный способ подачи многострочного ввода. Попробуйте прочитать из файла, написав: «Сканер сканер = новый сканер (Paths.get (<путь к файлу в строке здесь>));'. Также используйте 'StringBuilder' для добавления строк в' b', так как 'String' является неизменным, поэтому он будет подвержен ошибкам производительности, если вы выполните' + = '. –

+0

извините. я не понял, что вы имеете в виду. –

ответ

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

есть проблема с этим.В моей программе строки могут быть пустыми, и после нее могут быть строки. таким образом он просто сохраняет строку, пока не будет пустой линией. –

+0

, тогда вы можете просто указать любые другие символы, которые были бы уникальными и никогда не появятся на вашем входе, и использовать это как терминатор. вы также можете проверить это: http://stackoverflow.com/questions/16206813/how-to-terminate-scanner-when-input-is-complete, но вам нужно запустить его с терминала вместо IDE , –

1

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

Давайте предположим, что ваша программа:

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

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