2014-11-21 69 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

你的程序意图是正确的。您尝试提供多行输入的方式是错误的。尝试从文件中读取,写入:'Scanner scanner = new Scanner(Paths.get());'。另外''StringBuilder'用于追加'b'中的行,因为'String'是不可变的,所以如果你对它执行'+ =',它会产生性能命中。 – 2014-11-21 06:09:58

+0

对不起。我不明白你的意思。 – 2014-11-21 06:43:49

回答

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

这有一个问题。在我的程序中,行可能是空的,行后可能有行。以这种方式它只是保存字符串,直到不是空行。 – 2014-11-21 06:42:24

+0

然后您可以指定任何其他字符,这些字符是唯一的,并且永远不会出现在您的输入中,并将其用作终止符。你可能也想检查一下:http://stackoverflow.com/questions/16206813/how-to-terminate-scanner-when-input-is-complete,但你需要从终端而不是IDE运行它。 – 2014-11-21 06:52:58

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已回答一个不同的方法,所以我不写在这里。