【Android】【Java】SDカードからテキストファイルを読み込む 
2014/06/22 Sun [edit]
今度は Android の外部ストレージ(SDカード)からテキストファイルを読み込んでみる。エミュレータで試したいときはSDカードのマウントが必要なので、以下のHPあたり参考にすると良いだろう。上手く行かなければコマンドラインで起動する手もある。
(参考) Androidエミュレーターの仮想SDカードを使う
(参考) SDカードをマウントしてエミュレーターを起動
上手くマウントできたなら、DDMS でも確認できる。マウントフォルダは Android端末によって異なるが、「/sdcard」や「/mnt/sdcard」辺りを覗いて見ればわかるだろう。もしファイルがあれば、DDMS の右上あたりにある [push]ボタンでファイル転送、[pull] ボタンで開発環境にファイルをコピーもできる。
コードは今までよりも少し多くなる。と言っても基本は変わらないのだが、SDカードは脱着が容易なため、常にマウントの状態を確認しなければならない。それと先ほど述べたように、端末によってルートディレクトリが違うので、動的に取得する必要がある。その辺のコードが少し加わっただけだ。
ストリームからのテキストファイル読み込みは例によって以前作ったものをそのまま使う。
loadText() - ストリームからテキストファイルを読み込む
手順を簡単に説明すると、次のようになる。
1.SDカードのマウント状態やルートディレクトリを調べる。
2.SDカードの入力ストリームを開く。
3.ストリームからテキストエンコーディングして文字列を返す。
●SDカードの入力ストリームを開く部分 [Android 用]
(※) Android4.4(API 19)あたりから内部ストレージの仮想パスに変わった模様
//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード
// SDCard のマウント状態をチェックする(Android 用)
public static final boolean isMountSDCard() {
final String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
return true; //マウントされている
} else {
return false; //マウントされていない
}
}
// SDCard のルートディレクトリを取得(Android 用)
public static final File getSDCardDir() {
return Environment.getExternalStorageDirectory();
}
// SDCard 内の絶対パスに変換(Android 用)
public static final String toSDCardAbsolutePath(String fileName) {
return getSDCardDir().getAbsolutePath() + File.separator + fileName;
}
// SDCard から、テキストファイルを読み込む(Android 用)
public static final String loadTextSDCard(String fileName) throws IOException {
if (!isMountSDCard()) { //マウント状態のチェック
throw new IOException("No Mount");
}
InputStream is = new FileInputStream(toSDCardAbsolutePath(fileName));
return loadText(is, DEFAULT_ENCORDING);
}
//メインでは... (※例外処理は省略)
String fileName = "sample.txt"; //"mnt/sdcard/sample.txt" or "sdcard/sample.txt" 等になる(端末による)
String text = loadTextSDCard(fileName);
System.out.println(text); //Log.d("tag", text); でも良い
マウント状態のチェックでは IOException() にメッセージを付けてあるが、判別しずらければ、他の Exception に変えたほうが良いかも知れない。本来なら外部ストレージの状態は様々な定数で表現されているのだが、ここではとりあえず、マウントだけをチェックしている。必要があれば、色々チェックしても良いだろう。
●ストリームからテキストエンコーディングして読み込む部分 [汎用](- 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);
}
次回は SDカードへの書き込みも考えてみよう。と言ってもこれまでのものを組み合わせると簡単にできる。
テキストファイルの読み込みや保存をまとめたページは→こちら
(関連記事)
【Android】SDカードにテキストファイルを保存する
【Android】エラーをSDカードに書き出す
【Android】SDカードから画像ファイルを読み込む
【Android】SDカードのファイルを削除する
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【汎用】ストリームからテキストファイルを読み込む(ストリームから読み込み、テキストエンコードして返す)
【汎用】ローカルシステム(Windows 等)から、テキストファイルを読み込む
【Applet/汎用】URL経由でWebサーバ上のテキストファイルを読み込む
【Applet】jar 内リソースからテキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ
【Android】Preference 機能を使ってデータを読み込み・保存する
- 関連記事
-
-
【Android】【Java】FontMetrics 図解
-
【Android】【Java】SDカードのファイルを削除する
-
【Android】【Java】SDカードからテキストファイルを読み込む
-
【Android】【Java】内部ストレージから画像ファイルを読み込む
-
【Android】【Java】画像リソースIDをコードで取得する
-
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/123-69335a5b
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |