本節では、テキストファイルの入力を扱います。バイナリファイルの入力は扱いません。
ファイル入力のためには、FileInputStreamクラスを利用します。ところが、このクラスが提供する機能はとても貧弱のため、このクラスだけでテキストの入力を行うのは大変です。便利なBufferedReaderクラスを利用するために、InputStreamReaderクラスを間に挟ませます。
詳しい解説はしません。ほとんど定型的に利用すれば大丈夫です。ただし、コンストラクタにおいて非ランタイム系例外である FileNotFoundExceptionが発生する可能性があり、readLineメソッドにおいて非ランタイム系例外である IOExceptionが発生する可能性があるため、これらを catchするか throwsするかを明示する必要があります。
また、ファイル入力が終わったら、closeメソッドを使用してファイルを閉じます。
これらのクラスについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→FileInputStreamクラス、InputStreamReaderクラス、BufferedReaderクラス。
テキストファイルから文字列を読み込むプログラムを製作してみます。
ソースコードは以下の通り。
U201/U201.java
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; /** * ファイル入力します。 */ public class U201 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { try { // 一連のインスタンスを生成 FileInputStream fis = new FileInputStream("sample.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); while(true) { String line = br.readLine(); if(line == null) { // もし nullならばループから抜ける break; } System.out.println(line); } // クローズする br.close(); } catch(FileNotFoundException e) { System.out.println("ファイルが見つかりませんでした。"); } catch(IOException e) { System.out.println("入出力例外が発生しました。"); } } }
なお、このプログラムを実行する前に、U201プロジェクトで生成された sample.txtをコピーして、U201プロジェクトに貼り付け(Paste)しておきます。
実行結果は以下の通り。
abcdefg こんにちは。 こんばんは。
上手く読み込むことができていることが分かります。
readLineメソッドは、テキスト 1行分を入力するためのメソッドです。今回は、指定されたファイル sample.txtの内容が一行ずつ格納されていきます。戻り値が nullの場合には、ファイルの終端に到達したということなので、ループから離脱します。
Java仮想マシン内では、文字コードはUnicodeと決められています。ただ、キーボードからの入力や画面への文字表示は、適宜、Java仮想マシンが動作するパソコンの文字コードへの変換が行われていました。もし、仮にこのような変換が行われないならば、入力も出力も文字化けしてしまいます。
ファイル入出力においても、Java仮想マシンが動作するパソコンの文字コードへの変換が自動的に行われます。例えば、Windowsパソコンの場合には、テキストファイルがシフトJISコードであると仮定して読み込まれます。
もし、特定の文字コードで記述されたテキストファイルを読み込みたい場合には、InputStreamReaderクラスのコンストラクタで、文字コードを指定することで対応できます。
Androidソフトウェア開発においてファイル入出力をしたい場合には、本章のようなやり方はできません。というのは、この方法では、端末内のすべてのディレクトリやファイルに対してアクセスできてしまうために、セキュリティ上の問題が発生してしまうためです。
Androidソフトウェア開発においては別の方法がありますので、必要に応じて調べてください。