2017-10-16 5 views
0

私はScannerに関する具体的な問題があり、その入力方法はSystem.inです。Javaマルチラインスキャナ入力

私がしたいこと:System.inから与えられた1つの入力を読む必要があります。問題は、この入力が複数の行を持つ可能性があることです(入力には多くの場合、\n文字を使用できます)。

私が試した明白なことがScanner.nextLine()方法であるが、勿論、これはすべてのデータを読んでいないだろう:私が試した何

。私が試した次のことはこれです:

Scanner sc = new Scanner(System.in); 
List<String> data = new ArrayList<>(); 

while(sc.hasNextLine()){ 
    String line = sc.nextLine(); 
    if(line.isEmpty()){ 
     break; 
    } 
    data.add(line); 
} 

しかし、これはまた、多くのデータをスキップします - 例えば、与えられたテキストの途中に空行があるとき。

また、break;のステートメントを削除しようとしましたが、while(sc.hasNextLine())ループが壊れることを願っていますが、スキャナがデータを待つため、これは起こりません。

これはJavaで実行できますか?お時間をいただきありがとうございます

+0

ループ自体を破る_will_。あなたはそれに行末の文字を付ける必要があります。 – Sweeper

+0

おそらくこれは解決策ですか? https://stackoverflow.com/a/42429171/3959856 –

答えて

0

OS XではCommand + D、WindowsではControl + Dを押すと、行末の文字が挿入されます。

スキャナが行末に達した場合、hasNextLineはfalseを返し、ループが終了します。

if(line.isEmpty()){ 
    break; 
} 

をして、複数行の入力後に行末文字を入力します。

だから、これを削除します。

これが許可されている場合は、入力を文字列としてスキャナに入力することもできます。たとえば、あなたが入力し、この入力したい場合:

Scanner line = new Scanner("Hello World\n" + 
     "This is a\n" + 
     "Multiline\n" + 
     "input"); 

またはファイルにあなたの入力を入れて、スキャナはそれを読んで聞かせすることができます:

Hello World 
This is a 
Multiline 
input 

をあなたは、このようなスキャナを初期化することができます

Scanner line = new Scanner(new File("path to your input file")); 
0

String read = ""; 
    Scanner sc = new Scanner(System.in); 
    String line; 
    while (sc.hasNextLine()) { 
     line = sc.nextLine(); 
     if (line.isEmpty()) { 
      break; 
     } 
     read += line + "\n"; 
    } 
    System.out.println(read); 
を読み取るためのこのタイプを使用します

ここではまず、次の行があるかどうかを調べます。もしあれば、sc.nextLine()メソッドを使ってデータを読み込み、読み込みデータが空白の場合はbreak loopを返します。

0

入力行ごとに1つの要素が複数の行で文字列のリストに読み込まれるようにするには、ユーザーは入力がいつ終了するかを指定する必要があります。これは多くの場合、WindowsのコマンドプロンプトではCtrl-Z、Linux、OS X、すべてのプラットフォームのIntelliJ IDE入力ウィンドウではCtrl-Dです。

次のコードで行を読むことができます:

Scanner sc = new Scanner(System.in); 
List<String> data = sc.tokens().collect(Collectors.toList());