SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android開発のためのJava SE再入門

ストリームでの入出力処理の基本

Android開発のためのJavaSE再入門(6)


  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイル入出力の基本

 ファイルに対して、ある処理の結果を書き込んだり、何らかのデータを読みとったりすることは、実際のアプリケーションにおいては、非常によく用いられる処理です。

 ここでは、このようなファイル入出力のプログラムを、ストリームを用いて行う処理の基本例として、解説することにします。

 なおファイル処理は、プログラムを実行するハードウェアに依存する部分があります。まずはWindows上で動作確認できるサンプルで一般的な説明を行い、記事の後半で、Andoridでのプログラム例を説明します。

ファイルからの入力

 最初にファイルの入力処理です。ファイルでは、文字でもバイナリでもあつかえますが、今回は文字ストリームを用いたテキストファイルの例を見ていきましょう。

 次のサンプルコードは、sample1.txtというテキストファイルを1行ずつ読み込み、標準出力に書きだす例です。

[リスト1]Sample1クラス
try {
    File f = new File("sample1.txt");            // (1)
    FileReader fr = new FileReader(f);           // (2)
    BufferedReader br = new BufferedReader(fr);  // (3)

    String line;
    try {
        // 1行ずつファイルの最後まで読み込む
        while ((line = br.readLine()) != null) { // (4)
            System.out.println(line);
        }
    }
    finally {
        br.close();                              // (5)
    }
}
catch (IOException e) {
    // ファイルがない等のエラーがあった場合の処理
}
  1. Fileオブジェクトの生成

     java.io.Fileクラスは、ファイルやディレクトリを操作するためのクラスです。ファイルやディレクトリの生成や存在確認、アクセス権や名称の調査など、さまざなメソッドが用意されています。ここでは、ファイル名を引数としてFileオブジェクトを生成しています。

  2. FileReaderオブジェクトの生成

     java.io.FileReaderクラスは、実際にファイルをオープンして文字を読み込むストリームクラスです。この例では、コンストラクタにFileオブジェクトを指定していますが、直接ファイル名を渡すことも可能です。その場合は、Fileクラスは不要です。

  3. BufferedReaderオブジェクトの生成

     java.io.BufferedReaderクラスは、FileReaderオブジェクトのデータを一時的に保持するクラスで、プログラムとの橋渡しとなるストリームクラスです。つまりファイルからのデータは、2つのストリームをたどるということです。ストリームオブジェクトは、少なくともひとつは必要ですが、このように連結することもできます。APIには、いろいろな処理に応じたストリームクラスが用意されています。なお、この例のファイルの読み込み処理は、BufferdReaderクラスを経由しないでも実現可能です。ただファイルやネットワーク通信のように、アクセスに少し時間がかかるデータに対しては、一時的にデータを蓄える(バッファ)ストリームオブジェクトを利用するのが通常です。バッファを介することで、物理的なアクセス回数が減り、プログラムの処理が速くなるからです。

  4. BufferdReaderのreadLine(またはread)メソッドで読み込む

     BufferedReaderクラスのreadLineメソッドは、改行文字(¥n)、復帰文字(¥r)、復帰改行文字(¥r¥n)のいずれかまでを1行とするテキストを読み込み、文字列として返します。結果の文字列には、終端の文字は含まれません。また、ストリームの終わりを検出すると、nullを返します。もうひとつの読み込みメソッドであるreadメソッドは、1文字単位でデータを読み込む場合に利用します。

  5. 各オブジェクトの終了処理

     Javaでは、オブジェクトの破棄はガベージコレクションにより自動で行われます。明示的に終了処理を記述する必要がないため、ストリームのクローズ処理も忘れがちになります。もちろんストリームオブジェクトが破棄されるときにクローズされるのですが、ストリームに関しては、使用時のみオープンして、使用後は速やかに閉じるのが基本です。このサンプルでは、BufferedReaderオブジェクトのcloseメソッドのみ呼んでいます。BufferedReaderオブジェクトは、FileReaderオブジェクトを引数として生成しています。つまり、連結されたストリームオブジェクトは、数珠つなぎになっているのです。最後のストリームオブジェクトをクローズすることで、連結されたストリームすべてがクローズされ、その過程でファイルも解放されることになります。なお、closeメソッドの呼び出しは、finallyブロックに記述するようにしましょう。これは、ファイルの読み込み中に例外が発生した場合でも、クローズ処理が漏れないようにするためです。

文字コードの指定

 このようにFileReaderクラスは、お手軽に利用できるクラスですが、残念な面もあるクラスです。それは、明示的に文字コードを指定して読み込めないところです。

 FileReaderクラスでは、Java仮想マシンのデフォルト・エンコーディングにしか対応していないため、日本語などで文字化けが発生する場合があります。文字コードを指定してテキストファイルを読み込みたい場合には、FileReaderクラスの代わりに、バイト単位のストリームクラス、FileInputStreamクラスとInputStreamReaderクラスを組み合わせます。

 例えば、Windowsで用いられる文字コード、Windows-31Jのテキストファイルであれば、次のようになります。InputStreamReaderの第2引数に、文字コードを指定します。

InputStreamReader isr = new InputStreamReader(
                          new FileInputStream(f), "Windows-31J"); // (2)
BufferedReader br = new BufferedReader(isr);                      // (3)

ファイルへの出力

 テキストファイルに出力する基本的な手順は、入力処理と同じような手順になります。Fileオブジェクトを生成した後、FileWriter(またはOutputStreamWriterとFileOutputStreamのペア)とBufferedWriterのオブジェクトを生成します。そして、BufferedWriterクラスのwriteメソッドを呼び出して、データを書きだします。

 具体的な例は、次のAndoridで動作するサンプルで紹介することにしましょう。

次のページ
Androidのファイル入出力処理

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Android開発のためのJava SE再入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6299 2011/12/26 17:18

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング