SHOEISHA iD

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

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

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

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

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


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

Androidのファイル入出力処理

 サンプルコードの紹介の前に、少しAndroidでのファイル入出力処理全般の話をしておきます。Androidでも、ファイル入出力処理は、これまで説明した手順と大差はありません。ただ注意すべき点(主にハードウェアに依存する部分)もあります。

入出力ファイルの位置

 Androidでは、任意の場所にあるファイルを、自由に操作することは許されていません。端末の内部にあるストレージなら、アプリケーションから入出力できるのは、/data/data/[パッケージ名]/files/以下のファイルと決められています。そのため、パス名を指定してストリームオブジェクトを生成する場合、このパスを指定しないとエラーになってしまいます。

専用メソッド

 Androidでは、ファイルのストリームを取得するための専用メソッドとして、openFileInput、openFileOutputというふたつのメソッドがContextクラスに用意されています。これらのメソッドでは、規定のパス名の指定が不要になります(指定できない)。また戻り値として、FileInputStream/FileOutputStreamオブジェクトを返します。

ファイル出力

 次のサンプルは、openFileOutputメソッドを使って、ファイルにテキストを書きだす例です。

try {
    OutputStreamWriter osw = new OutputStreamWriter(
                    openFileOutput("sample.txt" Context.MODE_WORLD_READABLE));
    BufferedWriter bw = new BufferedWriter(osw);
    try {
        bw.write("abc");
        bw.newLine();      // 改行の出力
    }
    finally {
        bw.close();
    }
}
catch (IOException e) {
}

 なお、openFileOutputメソッドの第2引数はファイルの操作モードです。次の定数が指定でき、or(|)で区切ることで複数指定も可能です。

操作モードに指定可能な定数
定数 概要
MODE_APPEND 追記モードで開く
MODE_PRIVATE 作成したアプリケーションのみアクセス可能にする
MODE_WORLD_READABLE 他アプリケーションの読み込み可にする
MODE_WORLD_WRITEABLE 他アプリケーションの書き込み可にする

 Androidエミュレータでファイルが作成されていることを確かめるには、インストールされているTerminalEmulatorアプリ([Dev Tools]にある)を起動します。次のように、ファイルが作成されていることが確認できます。

図1 TerminalEmulatorでcatコマンドの表示
図1 TerminalEmulatorでcatコマンドの表示

PrintWriterクラス

 テキストの出力には、もっと使い勝手のよいストリームクラスも用意されています。PrintWriterクラスを使うと、書式付きでテキストを出力できます。次のようにC言語のようなprintfメソッドも利用できます。

PrintWriter pw = new PrintWriter( new BufferedWriter(osw) );
try {
    int n1 = 123;
    float n2 = 12.3f;
    pw.printf("%d %3.2f\n", n1, n2); // 出力文字列:123 12.30
}
finally {
    pw.close();
}

ファイル入出力のサンプル

 最後に、ファイルの書き込みと読み込み、そして読み取った内容を画面に表示するサンプルを紹介します。

 まず、main.xmlです。今回は次のように、ベースのレイアウトにIDを付与しておきます。レイアウトを参照する際に、このIDが必要なためです。

[リスト2]main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/parent"
    >
</LinearLayout>

 サンプルソースは、次のようになります。画面表示は、ベースとなるレイアウトに、TextViewコンポーネントを追加する形をとっています。

[リスト3]HelloAndroid.java
public class HelloAndroid extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // ベースのレイアウト取得
        LinearLayout parent = (LinearLayout) findViewById(R.id.parent);

        String f = "sample.txt";
        createTable(f); // ファイル作成

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    openFileInput(f)));
            try {
                String line;
                while ((line = br.readLine()) != null) {
                    TextView tv = new TextView(this);
                    tv.setTypeface(Typeface.MONOSPACE); // 等幅フォントの指定
                    tv.setText(line);
                    parent.addView(tv);                 // ビューの追加
                }
            } finally {
                br.close();
            }
        } catch (IOException e) {
        }
    }

    // ファイルに九九表を出力する
    public void createTable(String f) {
        try {
            PrintWriter pw = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(openFileOutput(f,
                            Context.MODE_WORLD_READABLE))));
            try {
                for (int i = 1; i < 10; i++) {
                    for (int j = 1; j < 10; j++) {
                        pw.printf("%3d ", i * j);
                    }
                    pw.printf("\n");
                }
            } finally {
                pw.close();
            }
        } catch (IOException e) {
        }
    }
}

 まずcreateTableメソッドで、ファイルに九九表を出力しています。さきほどのPrintWriterクラスを用いて、数値を書き込んでいます。

 ファイルの読み込みは、openFileInputメソッドで入力ストリームを取得し、InputStreamReaderとBufferedReaderクラスを使って、1行ずつ処理しています。取得した1行は、それぞれテキストビューに設定して(setTextメソッド)、レイアウトに追加(addViewメソッド)しています。なお、ここでは、フォントを等幅にするために、setTypefaceメソッドで、フォントファミリーにTypeface.MONOSPACEの指定をしています。ちなみにこれ以外では、Typeface.SERIF、Typeface.SANS_SERIFが指定できます。

 実行結果は次のようになります。もちろんファイルにも、まったく同様の内容が出力されています。

図2 実行結果
図2 実行結果

最後に

 今回は、ストリームを用いたファイル入出力の基本的な処理を説明しました。次回は、基本APIの中で、日付の処理など、まだ説明していなかったAPIをとりあげることにします。

参考資料

  1. Javaポケットリファレンス』 WINGSプロジェクト 高江賢 著、山田祥寛 監修、技術評論社、2011年3月
  2. Java Platform, Standard Edition 6 API 仕様
  3. Android Developers

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

  • 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 Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング