読者です 読者をやめる 読者になる 読者になる

【Android/Java】アプリ内のファイルの操作

アプリ内のfiles/以下(/data/data/[package name]/files/)の操作の備忘録です。

files/までのpathを取得

String filesDirectoryPath = context.getFilesDir().getPath();
//=> /data/data/[package name]/files

直接/data/data/[package name]/filesを入力すると、 将来ファイル構成に変更があった場合に動作しなくなる可能性があります。

files内のファイルまでのpathを取得

String absolutePath = context.getFilesDir().getPath() + "/" + relativePath
//=> /data/data/[package name]/files/[relativePath]

Fileを取得

File file = new File(absolutePath);

Fileのディレクトリのpathを取得

String path = file.getParent();

特定のファイルのディレクトリFileを取得

File directory = new File(file.getParent());

特定のファイルまでのディレクトリを作成

relativePathに"/“を含んだ階層化も全て作成されます。 注意点として、ディレクトリではなく、ファイルに対してmkdirs()をしてしまうと、 ファイル名の部分もディレクトリになってしまいます。

directory.mkdirs();

ディレクトリ内のファイル一覧を取得

String[] fileNames = directory.list();

Fileも取得できますが、Fileでないと困る場合を除いてStringの方が速いです。

ディレクトリ内のファイル一覧をフィルタを設定して取得

String[] fileNames = directory.list(new FilenameFilter(){
    @Override
    public boolean accept(File dir, String fileName) {
        //trueの場合、fileNamesに含まれる
    }   
});

書き込みなどをする場合はfileNamesにdirectoryまでのpathを加えたものにする必要があります。

読み込み

FileInputStream fs = new FileInputStream(absolutePath);

//以下読み込み処理

Androidではcontext.openFileInput(fileName)を使うこともできますが、 fileNameに"/“が含まれていると例外が投げられます。 階層化をするならFileInputStreamを使用する必要があります。

書き込み

FileOutputStream fs = new FileOutputStream(absolutePath);

//以下書き込み処理

TODO

  • BufferedReader
  • InputStreamReader
  • BufferedOutputStream

参考