FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Android »【Android】【Java】res/raw リソースフォルダからテキストファイルを読み込む

【Android】【Java】res/raw リソースフォルダからテキストファイルを読み込む  


 今回からはこれまでの Applet 等でのテキストファイル読み込みを Android に応用する。と言ってもやり方はほとんど変わらないので、応用というより流用に近いだろう。ストリームを開いてテキストエンコーディングすると言う基本は同じだ。その主要コードは以前のものを参照して貰いたい。もちろんコピペで構わない。

 loadText() - ストリームからテキストファイルを読み込む

 Android プロジェクト(ADT - Eclipse で開発を想定)ではリソース用のフォルダがあって、その中に汎用の「raw」フォルダがある。普段このフォルダは音声ファイルやビデオファイルなどを入れる事が多いのだが、テキストファイルでも構わない。またここは ADT がリソースID を管理してくれるので、「R.raw.~」のような int 定数でも表現できる。

 しかし今回のコードはそのリソースIDは動的に取得して、引数ではリソースの名前で受け取るようにしよう。わざわざそうした理由は、あくまで汎用性を考慮して、あとで使い回しやすいようなコードにして置くためだ。それは例えば後になって、そのリソースファイルの場所を「res」フォルダ以外に移動する等の場合だ。「R.id.~」「R.drawable.~」のような表記は一般的なものではない。だから他の ADT が ID を割り当ててない場所に移動した場合は使用できなくなる(assets フォルダとか)。つまりコード書き換えが必要になる。リソース名もそれは同じだが、今までのコードの引数がファイルパス名:String 型で作ってあるので、リソースID:int 型よりは融通が利くだろう。もちろん用途が限定しているなら、リソースID表記に書き換えても構わない。

●リソース名から res/raw フォルダの入力ストリームを開く [Android 用]
//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード

// res/raw フォルダから、テキストファイルを読み込む(Android 用)
public static final String loadTextRaw(String resName, Context context) throws IOException, FileNotFoundException {
final int id = context.getResources().getIdentifier(resName, "raw", context.getPackageName());
if (id == 0) { //エラーにはならない
throw new FileNotFoundException();
}
InputStream is = context.getResources().openRawResource(id);
return loadText(is, DEFAULT_ENCORDING);
}


//メインでは... (※例外処理は省略)
String resName = "sample"; // "res/raw/sample.txt" の場合
String text = loadTextRaw(resName, this); //this は起動した Activity が良い(Context)
System.out.println(text); //Log.d("tag", text); でも良い

 Android では、文字エンコーディングは "UTF-8" が推奨なので固定で良いだろう。Windows 環境での開発の場合は、テキストファイルがデフォルトで "Shift_JIS" になってる場合があるので注意。Eclipse での開発の場合は「ウィンドウ」メニューから「設定」-「一般」-「ワークスペース」-「テキスト・ファイルのエンコード」で "UTF-8" を設定して置いた方が良いかもしれない。

 上記の例ではリソース名からIDを引いているが、もちろん R.raw.~ のID (int 型)をそのまま用いても良い。ただし、ID = 0 だけはファイルは見つからないので、そこだけチェックしておくと良いだろう。その場合は以下のようになる。

●リソースIDから res/raw フォルダの入力ストリームを開く [Android 用]
// res/raw フォルダから、テキストファイルを読み込む(Android 用)
public static final String loadTextRaw(int rawId, Context context) throws IOException, FileNotFoundException {
if (rawId == 0) {
return null;
}
InputStream is = context.getResources().openRawResource(rawId);
return loadText(is, DEFAULT_ENCORDING);
}


//メインでは... (※例外処理は省略)
String text = loadTextRaw(R.raw.text, getApplicationContext()); // "res/raw/sample.txt" の場合(第2引数はthisでも良い(Context))
System.out.println(text); //Log.d("tag", text); でも良い

 なお、どちらもテキストにエンコードする部分は以下の関数を使う。

●ストリームからテキストエンコーディングして読み込む部分 [汎用](- loadText() ※以前作ったものを使い回し)
//設定値
private static final int DEFAULT_READ_LENGTH = 8192; //一度に読み込むバッファサイズ

//ストリームから読み込み、バイト配列で返す
public static final byte[] readStream(InputStream inputStream, int readLength) throws IOException {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength); //一時バッファのように使う
final byte[] bytes = new byte[readLength]; //read() 毎に読み込むバッファ
final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength);

try {
int len = 0;
while ((len = bis.read(bytes, 0, readLength)) > 0) {
byteStream.write(bytes, 0, len); //ストリームバッファに溜め込む
}
return byteStream.toByteArray(); //byte[] に変換

} finally {
try {
byteStream.reset(); //すべてのデータを破棄
bis.close(); //ストリームを閉じる
} catch (Exception e) {
//IOException
}
}
}

//ストリームから読み込み、テキストエンコードして返す
public static final String loadText(InputStream inputStream, String charsetName)
throws IOException, UnsupportedEncodingException {
return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName);
}


 確認には「System.out.println()」を使っているが、Android 用の「Log.d("tag", text)」でも構わない。実は、System.out でも LogCat には表示される。しかし、他のプラットフォーム併用まで考えると、System.out の方が便利な気がする。
ちなみに LogCat に付いている「保管済みフィルター」の [+] ボタンを押して、「by Log Tag:」の項目に「System.out」と登録しておくと、Log 出力中に「System.out」のみを表示できる。Log クラスの debug や info 等のレベル、または独自タグなどでもフィルタリングはできるが、「System.out」は他の情報が混ざらない点と、引数が少なく、様々な型に対応してるので(オブジェクトを適当につっこんでも、勝手に toString() してくれるので)、実は意外と使い易かったりする(笑)。もちろん、本題には全く影響しないので、どちらでも好きな方で構わない。

 まだまだ Android には様々なファイル保管場所があるので、次は、assets フォルダからのテキストファイル読み込みを試してみよう。

 テキストファイルの読み込みや保存をまとめたページは→こちら


(関連記事)
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Applet/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【Applet】jar 内リソースからテキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する



関連記事
スポンサーサイト



category: Android

thread: プログラミング

janre: コンピュータ

tag: テキストファイル読み込み 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/119-3b33644a
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR