アプリ内のテキストファイルの読み込み

(ブログ記事の一覧は「こちら」)

クイズアプリや学習アプリのようなアプリは、たくさんのテキストデータを必要とします。そのような場合、アプリ内にあらかじめテキストファイルを用意しておくと便利です。
基本的なサンプルプログラムで、アプリ内のテキストファイルを読み込む方法を学びましょう。

ここで学ぶこと

  • アプリ内にセットしたテキストファイルの読み込み
  • Logクラス(Logcat)

準備

以下の内容でテキストファイル「sample_list.txt」を作成します。(UTF-8で保存する)

おはよう
こんにちは
さようなら
おやすみ

続けて、app / src / main / res に「raw」フォルダを作成します。
rawフォルダに「sample_list.txt」を置きます。

つまり、以下の場所にテキストファイルが配置されることになります。
app / src / main / res / raw / sample_list.txt

例題1

アプリ内のrawフォルダにあるテキストファイルを読み込み、Logcatに出力するサンプルプログラムです。

作成するもの

アプリ内のrawフォルダにあるテキストファイル「sample_list.txt」を読み込み、Logcat(Android Studio の左下あたりにある「Logcat」をクリックして表示される、ログ一覧)に出力します。

レイアウト

ここでは特に必要ありません。
Logcatにテキストが出力されることを確認するだけです。

プログラム

まず、テキストファイルを読み込むプログラムを示します。

private void readRawFile(int strRawFileName) {
    InputStream is = null;
    BufferedReader br = null;
    try {
        is = getResources().openRawResource(strRawFileName);
        br = new BufferedReader(new InputStreamReader(is));

        String strSentence = null;
        while ((strSentence = br.readLine()) != null) {
            // 1行ずつ読み込む
            Log.v(TAG, strSentence);
        }

        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


全体のプログラムは以下のようになります。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample05_main);

        readRawFile(R.raw.sample_list);
    }

    private void readRawFile(int strRawFileName) {

        (省略)
    }
}


ファイルを読み込むプログラムの一部を説明します。

rawフォルダにあるテキストファイルにアクセスするには、Resourcesクラスで定義されているopenRawResource関数を使います。
結果は、InputStreamクラスの(バイト型)ストリームを取得します。

InputStream is = getResources().openRawResource(R.raw.sample_list);

まず、InputStreamクラスの(バイト型)ストリームから、InputStreamReaderクラスの(文字列)ストリームを取得します。
InputStreamReaderクラスの(文字列)ストリームからテキストファイルを読み込むには、BufferedReaderクラスを使用します。

BufferedReader br = new BufferedReader(new InputStreamReader(is));

BufferedReaderクラスのreadLineメソッドで、テキストファイルを1行ずつ読み出すことができます。

while ((strSentence = br.readLine()) != null) {
    (省略)
}

実行、確認

アプリを実行して、Logcatにリストの項目が1つずつ表示されることを確認してください。

例題2

例題1で読み込んだテキストデータを、TextViewに出力するサンプルプログラムです。

作成するもの

例題1のプログラムに、読み込んだテキストデータを出力するTextViewを追加するプログラムを作成します。

レイアウト

  • TextView

プログラム

テキストファイルを1行ずつ読み出すので、それぞれの文字列を連結する必要があります。
JavaではStringクラスを「+」するのではなく、処理速度面のメリットからStringBufferクラスまたはStringBuilderクラスを使用すると良いです。

private void readRawFile(int strRawFileName) {
    InputStream is = null;
    BufferedReader br = null;
    try {
        is = getResources().openRawResource(strRawFileName);
        br = new BufferedReader(new InputStreamReader(is));

        // StringBuffer, StringBuilder どちらでも良い
//     StringBuffer sbSentence = new StringBuffer();
        StringBuilder sbSentence = new StringBuilder();

        String strSentence = null;
        while ((strSentence = br.readLine()) != null) {
            // 1行ずつ読み込む
            Log.v(TAG, strSentence);

            // 改行を追加
            sbSentence.append(strSentence + "\n");
        }

        br.close();

        // 読み込んだテキストを表示
        TextView textView = findViewById(R.id.textView);
        textView.setText(sbSentence.toString());

    } catch (IOException e) {
        e.printStackTrace();
    }
}

実行、確認

アプリを実行して、TextViewにテキストデータが表示されることを確認してください。

課題1

改行で区切りられた(1行ずつ読み出した)テキストを、ListViewに表示してください。
(sample_list.txt の場合、4つの単語を1つずつ割り当てて表示します。)

f:id:MJeeeey:20191001084855p:plain:w240

課題2

rawフォルダに、以下のCSV(カンマ区切り)ファイル「sample_list2.csv」を用意してください。

朝,7:00,おはよう
昼,12:00,こんにちは
夕方,17:00,さようなら
夜,23:00,おやすみ

このCSVファイルを読み込み、ListViewに表示してください。

(ListView表示)
--------------------------------
朝     7:00  おはよう
--------------------------------
昼   12:00  こんにちは
--------------------------------
夕方  17:00  さようなら
--------------------------------
夜   23:00  おやすみ
--------------------------------