行の読み取り
readLineとループを学びます。
「行の読み取り」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
readLineメソッド
readLine()はBufferedReaderの中心となるメソッドです。改行(Enter)に到達するまで文字を読み取り、その行をStringとして返します。
返されるテキストには改行文字は含まれません。このレッスンでは、1行および複数行の読み取りを行います。
String line = br.readLine();1行を読み取る
最も単純な例として、名前を読み取り、挨拶を表示します。readLine()は、ユーザーがEnterを押すまでブロックして待機します。
System.inから読み取るため、このスニペットはキーボード入力を待ち、ここでは自動実行できません。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
System.out.println("Welcome, " + name + "!");
}
}入力の終端でreadLineが返す値
入力がもう存在しない場合(ストリームの終端、またはユーザーがEOFを送信した場合)、readLine()はStringの代わりにnullを返します。
これは重要なシグナルです。nullを確認することで、読み取りを停止するタイミングが分かります。
String line = br.readLine();
if (line == null) {
System.out.println("No more input.");
}EOFまで読み取る
入力が終わるまで各行を読み取るには、readLine()がnullでない間ループします。この一般的なパターンでは、1つの条件式で代入と確認を行います。
ループを1回繰り返すたびに次の行が得られ、nullになるとループが正常に停止します。
String line;
while ((line = br.readLine()) != null) {
System.out.println("Got: " + line);
}複数行の読み取り
ストリームが終わるまで入力したすべての行をエコーバックする完全なプログラムを見てみましょう。
System.inから読み取るため入力を待ち、ここでは自動実行できませんが、ループのパターンはそのまま再利用できます。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
System.out.println("Echo: " + line);
}
}
}行数を数える
数を数えるなど、ループ内で処理を行うこともできます。ここでは読み取った行数を集計します。
反復ごとに新しい行を読み取り、カウンターを増やします。入力が終わると合計を表示します。
int count = 0;
String line;
while ((line = br.readLine()) != null) {
count++;
}
System.out.println("Lines read: " + count);空行とnullの違い
注意してください。空行(ユーザーがEnterだけを押した場合)は空のStringである""を返し、nullは返しません。
したがって、"".equals(line)は空行を意味し、line == nullは入力が本当に終了したことを意味します。これらは異なるものです。
if (line == null) {
// input finished
} else if (line.isEmpty()) {
// user pressed Enter on a blank line
}stdinなしで行をシミュレートする
キーボード入力なしでreadLine()の動作を確認するには、StringReaderからBufferedReaderに入力を渡します。これは完全に実行可能です。
文字列には\nで区切られた2行が含まれており、ループがそれぞれの行を表示します。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new StringReader("apple\nbanana"));
String line;
while ((line = br.readLine()) != null) {
System.out.println("Fruit: " + line);
}
}
}空白をトリミングする
入力には余分な空白が含まれていることがよくあります。行を使う前にtrim()を使用して、先頭と末尾の空白を削除します。
ユーザーが誤って空白を追加した場合でも、比較やパースの信頼性を保てます。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new StringReader(" hello \n"));
String line = br.readLine().trim();
System.out.println("[" + line + "]");
}
}決まった行数を読み取る
あらかじめ行数が分かっている場合もあります。forループを使うと、指定された行数だけ正確に読み取れます。
これは「最初の数値が、後に続く行数を示す」という問題でよく使われます。
for (int i = 0; i < 3; i++) {
String item = br.readLine();
System.out.println(i + ": " + item);
}readLineで覚えておくこと
次の点を覚えておきましょう:
- 行を使う前に、必ず
nullかどうかを確認します。 - 余分な空白がバグの原因になる可能性がある場合は
trim()を使います。 - 空の文字列は
nullと同じではありません。
次は、これらの行を数値に変換します。
確認問題
入力ストリームが終端に達したとき、readLine()は何を返しますか?
まとめ
1行ずつ読み取り、while ((line = br.readLine()) != null)でループし、空行("")と入力の終端(null)を区別する方法を学びました。
StringReaderを使った実行可能な例も確認しました。次は、テキスト行を数値に変換します。
よくある質問
「行の読み取り」レッスンは無料ですか?
はい。「行の読み取り」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「行の読み取り」で何を学びますか?
readLineとループを学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「行の読み取り」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。