ほぷしぃ

Java言語入門 〜C言語を学んだ君へ〜

[第16回]入出力

[1] 入出力の基礎知識

Javaでの入出力を行うための基礎を説明します。

ストリーム

Javaで入出力を行うにはストリームを使います。
ストリームとは「データの流れ」を表す抽象的な概念です。
ストリームを使用する目的は、異なる物理デバイスでも、簡単に入出力を行うためです。

入出力と言ってもいくつもの種類があります。
例えば、キーボード入力とモニタ出力、ファイルへの入出力などです。
これらに対して、個別に入出力の方法を適用することはとても大変です。
しかし、ストリームという抽象的な概念を使うことで、同じ処理で入出力が可能になります。

文字ストリームとバイトストリーム

ストリームには2つの種類があります。
それは文字ストリームバイトストリームです。

文字ストリームとは、テキストデータを扱うためのストリームです。
バイトストリームとは、バイナリデータを扱うためのストリームです。

例えば、メモ帳などで作成する文章は、テキストデータであり、
画像、音楽ファイルはバイナリデータになります。

対象となるデータによって、2つのストリームを使い分けて入出力を行います。

入出力パッケージ

Javaには入出力を行うためのクラスがパッケージとして用意してあります。
そのパッケージが「java.io」です。
このパッケージには次のクラス関係があります。

入出力クラス

それぞれのストリームに対してのクラスが提供されています。
少し多いですが、この回で使用するクラスは

「InputStreamクラス」
「BufferedReaderクラス」
「BufferedWriterクラス」
「FileReaderクラス」
「FileWriterクラス」

の5つです。なお、上記以外にも入出力クラスはあります。
他のクラスについての説明はAPIを見てください。

[2] コンソール入力

コンソールからの入力方法を説明します。
C言語を学んだ方によっては、少し遅いと思ったことでしょう。
しかし、Javaでは入出力を行うために、「クラス」、「パッケージ」、「例外」など、
多くの知識が必要になります。少し難しいかもしれません。

良くない方法

いきなり「良くない方法」を説明します。良い方法はあとで説明します。

ところで、コンソール出力をする場合は、「System.out.println()」を使います。
この「out」とは、PrintStreamクラスであり、このクラスのメソッドを用いて出力を行います。
この他に、Systemクラスには「in」というオブジェクトを持っています。
これはInputStreamクラスであり、標準でキーボード入力ができます。
つまり、このクラスを使うことで、コンソール入力が行えます。

では、コンソール入力のサンプルプログラムを次に示します。
なお、読み込みにはInputStreamクラスのreadメソッドを使います。

サンプルプログラム1

import java.io.*;    // インポート

public class Java16_01 {
    public static void main(String args[]) {
        try {
            System.out.print("入力してください:");
            int n = System.in.read();
            System.out.println("入力したデータ:" + n);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果1

悪い入出力

実行結果より「何か」の入力はできたと思います。
ただし、正しい文字入力はできていません。
その理由は、InputStreamクラスは1バイトデータしか扱えないからです。
つまり、文字入力はできません。
これを改善するには「ストリームのラッピング」が必要になります。

ストリームのラッピング

ストリームのラッピングとは、ストリームをストリームで覆い(ラッピングを行い)、高性能な入出力ストリームにすることです。

上のプログラムではInputStreamクラスを使ってコンソール入力を行いました。
しかし、このクラスは「低機能」のため、文字入力が正しくできませんでした。
そこで、ラッピングを行って「高性能」にします。

方法はInputStreamクラスをInputStreamReaderクラスでラッピングします。
これによって、文字単位の入力ができるようになります。

さらに、InputStreamReaderクラスをBufferedReaderクラスでラッピングすると、
一行単位の入力ができるようになります。それにはreadLineメソッドを使います。
次のサンプルプログラム2を見てください。

サンプルプログラム2

import java.io.*;

public class Java16_02 {
    public static void main(String args[]) {
        try {
            // InputStream→InputStreamReader→BufferedReaderの順にラッピング
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("入力してください:");
            String s = br.readLine();
            System.out.println("入力したデータ:" + s);
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果2

正しい入出力

今度は正しくコンソール入力ができます。
少し、ラッピングの方法は難しかったかもしれません。
なお、作成したストリームを使用した後は、close()メソッドで終了してください。
これについては、C言語と同じです。

ところで、このサンプルプログラム2ではBufferedReaderクラスを使いました。
しかし、このクラスを使わなくても、InputStreamReaderクラスのみで文字入力は可能です。
使用した理由は、BufferedReaderクラスを使うことで、文字入力の効率が向上するからです。
そのため、文字列を扱うときは、BufferedReaderを使用した方法が良いでしょう。



第15回へ ページのトップへ 次のページへ