Android assetsからテキストファイルを読み込む

assetsディレクトリを作成して
assets内に置いたテキストファイルを読み込む処理をする。

res/ とは違って、assets/ の場合はリソースIDは付与されない。
なので AssetManager を利用して読み込む。

assetsを利用する意図は何かはよくつかめないが
元ファイルやディレクトリにアクセスが必要になるときに使用するとか。

一般的な操作ではない、とも言ってるので利用価値はないのかも。。

あと、容量制限で非圧縮の1MB以上のファイルはエラーになるとか注意点もある。
zipとかで圧縮してたら制限にひっかからない。

 

assetsディレクトリ作成

画像を見てもらうと分かるが
main/ 配下に新規ディレクトリとして assets を作成する。

ついでに読み込み用のテキストファイルも置いておく。

 

assetsからテキストを読み込み表示する処理

public class MainActivity extends AppCompatActivity {

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

        InputStream inputStream = null;
        BufferedReader bufferedReader = null;

        StringBuilder stringBuilder = null;

        try {
            // assetsから「sample.txt」を取得する処理
            inputStream = getAssets().open("sample.txt");
            // getAssets()で取得したbyte単位のデータを
            // InputStreamReaderでchar単位のデータにして
            // バッファリング(データを一定数溜めてから入力処理)する
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            String str;
            stringBuilder = new StringBuilder();
            // 1行読み込みを繰り返す(改行もつける)
            while ((str = bufferedReader.readLine()) != null) {
                stringBuilder.append(str);
                stringBuilder.append("¥n"); // 改行
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) inputStream.close();
                if (bufferedReader != null) bufferedReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (stringBuilder != null) {
            TextView textView = findViewById(R.id.text_view);
            textView.setText(stringBuilder.toString());
        }
    }
}

処理は上記コードに書いた通り。

getAssets().open(“[ファイル名]”)
という形でファイルを取得する。

結果の画像はコレ

 

assets内のパス指定

assets/doc/sample.txt
という構成になっていた場合

inputStream = getAssets().open("doc/sample.txt");

という形でファイル名にパスを付けると取得できる。

 

finallyのclose処理を省略する

Java7 から tryブロック を抜けるときに
リソースを close() してくれるようになったのだが
その場合が以下の処理。

StringBuilder stringBuilder = null;

try (InputStream inputStream = getAssets().open("sample.txt");
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {

    String str;
    stringBuilder = new StringBuilder();
    // 1行読み込みを繰り返す(改行もつける)
    while ((str = bufferedReader.readLine()) != null) {
        stringBuilder.append(str);
        stringBuilder.append("¥n"); // 改行
    }
} catch (IOException e) {
    e.printStackTrace();
}

if (stringBuilder != null) {
    TextView textView = findViewById(R.id.text_view);
    textView.setText(stringBuilder.toString());
}

try() でカッコ内に InputStream などを書いて
finally を省略しているのが分かる。

注意としては、
・リソースのスコープはtryブロック内であること
・close() 処理中に発生した例外は無視されること

開発日記

Posted by konp