Androidアプリ制作において、何かしらファイルを配置しておいてそれをアプリで利用したい場合がある。
そんな時に便利なのがassetsフォルダだ。今回はこのassetsフォルダにファイルを配置して、プログラムから読み込みを行ってみよう。

1.新しいプロジェクトを作成したらまずassetsフォルダを作ろう。
appをオプションクリックしてNew->Folder->AssetsFolderを選択する。

2.Assetsフォルダはsrc/main/の直下に配置されなければならない。そこに置くか?というダイアログがでるのでチェックしてfinish

3.フォルダが配置されたことを確認

4.念のため、src/main/の直下に配置されたか確認してみよう。
プロジェクトビューにしてみると、確かに配置されていることがわかる(確認したらAndroidビューに戻して置く)

5.テキストエディタで適当なファイルを作成し配置してみよう。まずは以下のようなsample.txtをUTF-8で作成する。
●sample.txt

Hello
Assets
Folder!

6.作成したらファイルをコピーしてassetsフォルダに配置する。

7.レイアウトファイルでデフォルトで配置されているTextViewにtvとidをつける。

8.以下のソースコード打ち込む


import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //findView
        TextView tv=(TextView)findViewById(R.id.tv);
        //AssetManagerの取得
        AssetManager am=this.getAssets();
        //ファイルの読み込み処理
        BufferedReader br=null;
        try {
            //アセットマネージャーがファイルをopenすることでInputStreamが得られる
            InputStream is=am.open("sample.txt");
            //ここらへんは定型処理
            InputStreamReader isr=new InputStreamReader(is,"UTF-8");
            br=new BufferedReader(isr);
            //文字列連結のためにStringBuilderを用意
            StringBuilder sb=new StringBuilder();
            String line;
            while((line = br.readLine()) != null){
                //appendで連結
                sb.append(line);
                //1行読み込んだら改行
                sb.append(System.getProperty("line.separator"));
            }
            //TextViewにsetText
            tv.setText(sb.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

9.以下のようにTextViewにファイルの内容が書き込まれる。

以上でassetsフォルダからファイルを読み込み処理は完了だ。

それでは、練習問題をやってみよう。

Q1
Java38日目でつくったsample2.csvファイルをassetsフォルダに配置し、リストビューに表示せよ。sample2.csvを未作成の人は下からダウンロードしてよい。

[実行例]

●Sales.java


public class Sales{
	private String year;
	private int salesA;
	private int salesB;
	public Sales(String year,int salesA,int salesB){
		this.year=year;
		this.salesA=salesA;
		this.salesB=salesB;
	}
	@Override
	public String toString() {	
		return String.format("%s年度の製品Aの売上高%d、製品Bの売上高%d", this.year,this.salesA,this.salesB);
	}
	public String toCSV(){
		return this.year+","+this.salesA+","+this.salesB;
	}
	
}


●MainActivity.java


import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv=(ListView)findViewById(R.id.lv);
        List<Sales> list=new ArrayList<>();
        ArrayAdapter<Sales> adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
        lv.setAdapter(adapter);
        AssetManager am=this.getAssets();
        BufferedReader br=null;
        try {
            InputStream is=am.open("sample2.csv");
            InputStreamReader isr=new InputStreamReader(is,"UTF-8");
            br=new BufferedReader(isr);
            String line;
            while((line=br.readLine()) != null){
                if(line.startsWith("年度")){
                    continue;
                }
                String[] data=line.split(",");
                list.add(new Sales(data[0],Integer.parseInt(data[1]),Integer.parseInt(data[2])));

            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        adapter.notifyDataSetChanged();
    }
}