0Pricing
Java Academy · レッスン

BufferedReaderという選択肢

コンソール入力を高速に読み取ります

「BufferedReaderという選択肢」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

より高速な読み取り方法

Scannerは便利ですが、大量の入力では比較的低速です。大量のデータを読み取る場合は、java.ioのBufferedReaderのほうが、一度に大きなまとまりを読み取るため、はるかに高速です。

BufferedReaderを作成する

System.inをInputStreamReaderでラップし、さらにBufferedReaderでラップします。ここでは、入力を手動で入力しなくても例を実行できるようにStringReaderを使います。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("Hello"));
        System.out.println(reader.readLine());
        reader.close();
    }
}

readLineはStringを返す

readLine()は、行終端文字を含めずに1行全体をStringとして読み取ります。Scannerとは異なり、常にテキストを返すため、数値の解析は自分で行う必要があります。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("first\nsecond"));
        System.out.println(reader.readLine());
        System.out.println(reader.readLine());
        reader.close();
    }
}

入力の終端ではnullになる

これ以上入力がない場合、readLine()はnullを返します。これが読み取りを停止する合図になります。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("one line"));
        System.out.println(reader.readLine());
        System.out.println(reader.readLine());
        reader.close();
    }
}

すべての行を読み取る

readLine()がnullでない間ループすると、入力のすべての行を処理できます。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("a\nb\nc"));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("> " + line);
        }
        reader.close();
    }
}

数値を自分で解析する

readLineはテキストを返すため、数値が必要な場合はInteger.parseIntで変換します。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("42"));
        int n = Integer.parseInt(reader.readLine().trim());
        System.out.println(n * 2);
        reader.close();
    }
}

行をトークンに分割する

1行から複数の数値を読み取るには、splitで行を分割し、それぞれの部分を解析します。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new StringReader("10 20 30"));
        String[] parts = reader.readLine().split(" ");
        int sum = 0;
        for (String p : parts) {
            sum += Integer.parseInt(p);
        }
        System.out.println(sum);
        reader.close();
    }
}

検査例外

readLineは検査例外であるIOExceptionを宣言するため、throws IOExceptionを宣言するか、呼び出しをtry-catchで囲む必要があります。Scannerではこの処理は必要ありません。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new StringReader("data"));
            System.out.println(reader.readLine());
            reader.close();
        } catch (IOException e) {
            System.out.println("Read error");
        }
    }
}

try-with-resources

try-with-resourcesを使うと、例外が発生した場合でもリーダーが自動的に閉じられます。

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader reader = new BufferedReader(new StringReader("auto-closed"))) {
            System.out.println(reader.readLine());
        }
    }
}

実際のSystem.inの例

実際にキーボードから入力する場合は、System.inをラップします。このコードをローカルで実行し、1行入力してEnterキーを押してください。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter text: ");
        String input = reader.readLine();
        System.out.println("You typed: " + input);
    }
}

ScannerとBufferedReaderの比較

便利さや数値の解析のしやすさを重視する場合はScannerを選びます。大量の入力を高速に処理する場合はBufferedReaderを選びます。ただし、その場合は解析とIOExceptionの処理を自分で行う必要があります。

確認問題

BufferedReaderに関する知識を確認しましょう。

まとめ

BufferedReaderという別の方法を学びました。

  • System.inをInputStreamReaderでラップし、さらにBufferedReaderでラップする
  • readLine()は1行全体を返し、入力の終端ではnullを返す
  • Integer.parseIntとsplitを使って数値を自分で解析する
  • 検査例外であるIOExceptionをスローするため、処理するか宣言する
  • 大量の入力や性能が重要な入力では、Scannerよりもこちらを優先する

よくある質問

「BufferedReaderという選択肢」レッスンは無料ですか?

はい。「BufferedReaderという選択肢」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「BufferedReaderという選択肢」で何を学びますか?

コンソール入力を高速に読み取ります ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「BufferedReaderという選択肢」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Scannerで入力を読み取る
  2. 数値と行の読み取り
  3. ユーザー入力の検証
  4. BufferedReaderという選択肢
← Java Academyに戻る