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

【Android】【Applet】【Java】ストリームからテキストファイルを読み込む  


 以前の「テキストファイルを読み込む」では、あくまでもテスト的なコードだったが、今度はより実用的なコードを書いてみる。なるべく汎用性を持たせるために、まず手始めにストリームから読み込むルーチンを作成する。本来ならパフォーマンスやエンコードなど、環境によってその都度最適化すべきだろうが、とりあえず何にでも使えそうなデフォルト値を決めて置くので、必要ならば、適当に修正すると良いだろう。

 ストリームの説明は割愛するが、以下のHPなどが分かり易いだろう。今回はテキストファイルをテーマにしてるが、ストリームの概念を覚えてしまえば、色々なファイルが読み込める。今回のコードも様々なデバイスから読み込むために、わざと機能分割して、いくつかのメソッドに分けてある。用途によってまとめても良いが、たぶんこれくらいの単位の方が、後々色々組み合わせて使うのには便利だろう。

(参考) ストリーム
(参考) バッファ入出力

//設定値
private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード
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);
}


//ローカルシステムから、テキストファイルを読み込む
public static final String loadTextLocal(String fileName) throws IOException, FileNotFoundException {
InputStream is = new FileInputStream(fileName);
return loadText(is, DEFAULT_ENCORDING);
}

//メインでは... (※例外処理は省略)
String fileName = "C:/res/data/sample.txt"; //相対パスでも良い
String text = loadTextLocal(fileName);
System.out.println(text);


 とりあえず、サンプルにローカルシステム(Windows 等)からテキストファイルを読み込むメソッドを並べてみた。例外処理は省略してある。ファイル処理の場合、おおよそ、FileNotFoundException, IOException がほとんどだろう。

 エンコードはデフォルトで "UTF-8" にしてあるが、"Shift_JIS" などにもできる。しかし、今後の事を考えるとすべて "UTF-8" にして置いた方が無難だろう。ちなみに Charset クラスで Charset.forName(charsetName) のように動的に引数を適正化することも考えたが、Android では String 変換時に上手く行かなかった。あまりいじることがないなら、文字列定数で十分だろう。

 readStream() では、8192 byte ずつ読み込むようにしてあるが、この辺りは環境によって違うかもしれない。Android 開発では Eclipse が 8K にしろと言っていたのでそうした(笑)。だがまぁ、ほとんどのシステムでも問題ないサイズだと思う。

 ByteArrayOutputStream というのはバイトストリームを一時バッファのように使うために、わざわざ生成している。あまりに巨大なファイルでなければ、メモリの許す限り自動的にバッファを拡張してくれるので採用した。バイト配列で返すので、実はテキストでなくても、画像でも音声でも構わない(別途デコードが必要になるが)。ストリームさえオープンしてしまえば、何でも良いので、独自データの読み込みなどにも使えるだろう。そのため、loadText() と分けてある。また読み込み終わったらバッファは破棄し、ストリームはクローズしてる。つまり開きっぱなしの連続使用は想定してない。

 少し細かくわけてしまったが、これからこのメソッドを使い回しして、様々なテキストファイルを読み込む関数を作ってみよう。ここまで出来てしまえば、流用は非常に簡単だ。

 次回は同 Web サーバ上にあるテキストファイルを読み込んでみよう


(関連記事)
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】assets フォルダからテキストファイルを読み込む
【Android】内部ストレージからテキストファイルを読み込む
【Android】内部ストレージにテキストファイルを保存する
【Android】SDカードからテキストファイルを読み込む
【Android】SDカードにテキストファイルを保存する
【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/116-f9a227cd
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop