明日も楽をするために

めんどくさがりなITエンジニアが書くメモ帳

Androidのアプリ内にファイルをフォルダ階層で持つ方法

Androidの仕様的に良いのか悪いのか分からないけど、問題なく動いているので折角なのでメモしておこうと思う(エミューレーターv4.4.2と実機v4.4で動作確認済み)

アプリ内にファイルを保存する場合は色々方法があるのだが、ローカルにファイルを持つ方法の一つとして/data/data/パッケージ名/filesにデータを保存する方法がある。

アプリにファイルを入れたい場合はassetフォルダや、res/rawに初めから入れておく方法もあるけど、そもそもGooglePlayで配信時にアプリの容量制限があるため大量のファイルを置く際は使用できない。

なので後からダウンロードしてfilesフォルダにデータを置く方法が一般的だと思う。

Androidにはfilesの中身を操作する関数がいくつか用意されていて

context.openFileOutput();
context.openFileInput();
context.deleteFile();
context.getfilesdir().getpath();

書き込み、読み込み、削除、パス取得などがあるが制限として「/」とか「¥」セパレータ文字が入るとExceptionが投げられるため使用できない。なので実質フォルダ階層を持つことが出来ない。

しかし私が試したところだと、Androidの関数を使わずJavaの関数を使うとフォルダ階層を持つことができるようだ。具体的に言うと以下のような感じで

//FileOutputStreamの場合は存在しないフォルダごと作ってくれる
String fileName = "test.txt";
new FileOutputStream(context.getfilesdir().getpath() + "/test/" + fileName);

//Fileを使う場合mkdirsで複数フォルダの同時作成が可能
new File(context.getfilesdir().getpath() + "/test/").mkdirs();

//以下Javaでそれっぽく・・・

Fileや、FileOutputStreamで作成できるようだ。ただしパスはfilesを使用しているが。

細かい検証はしてないが、書き込み、読み込み、削除は一通りできた。後は権限の設定が出来れば完璧だ(検証してない)

context.openFileOutputも返り値はInputStreamなので内部的には同じことをやっているだけかも知れない・・・・。

しかし折角フォルダ階層が使えるのに、それを制限してるのは勿体ない感じがする。

ちなみに言うとcontext.openFileOutputで/data/data/パッケージ名/filesのフォルダがないとExceptionが投げられるため、Fileのmkdirsを使用して初回はフォルダ作らないといけない

(´∀`;) o0(それぐらいはせめてやってくれ・・・)