何もなくなるまで(つまり、ユーザーが空白行を入力するまで)スキャナーでの入力を期待しています。どうすればこれを達成できますか?
私は試した:
while (scanner.hasNext()) {
// process input
}
しかし、それは私がループで立ち往生するでしょう
方法は次のとおりです。
Scanner keyboard = new Scanner(System.in);
String line = null;
while(!(line = keyboard.nextLine()).isEmpty()) {
String[] values = line.split("\\s+");
System.out.print("entered: " + Arrays.toString(values) + "\n");
}
System.out.print("Bye!");
http://www.Java-made-easy.com/Java-scanner-help.html から:
Q:Javaのスキャナーで空白行をスキャンするとどうなりますか?
A:状況によります。 nextLine()を使用している場合、空行は空の文字列として読み込まれます。これは、空行を文字列変数に格納する場合、変数が「」を保持することを意味します。 「」は保存されませんが、多くのスペースが配置されます。 next()を使用している場合、空白行はまったく読み込まれません。それらは完全にスキップされます。
技術的にスキャナは空の文字列_""
_を持つため、nextLine()
はまだ空白行でトリガーされます。したがって、if s.nextLine().equals("")
を確認できます
scanner.nextLine()
を使用する提案の問題は、実際に次の行をString
として返すことです。つまり、そこにあるテキストはすべて消費されます。その行の内容をスキャンすることに興味があるなら…まあ、あまりにも悪い!返されたString
の内容を自分で解析する必要があります。
より良い方法は、使用することです
while (scanner.findInLine("(?=\\S)") != null) {
// Process the line here…
…
// After processing this line, advance to the next line (unless at EOF)
if (scanner.hasNextLine()) {
scanner.nextLine();
} else {
break;
}
}
(?=\S)
はゼロ幅の先読みアサーションであるため、入力を一切消費しません。現在の行で空白以外のテキストが見つかった場合、ループ本文が実行されます。
ループ本体がその行のすべての非空白テキストをすでに消費していることが確実な場合は、else break;
を省略できます。
Scanner key = new Scanner(new File("data.txt"));
String data = "";
while(key.hasNextLine()){
String nextLine = key.nextLine();
data += nextLine.equals("") ? "\n" :nextLine;
}
System.out.println(data);