MotoJapan's Tech-Memo

技術めも

【Android】ファイル 書き出し(保存)、追記、エラー時(Java.illegalArgumentException : File contains a path separator) 対策

android アプリにおけるjava実装で忘れやすいことをメモメモ

ファイル 書き出し(保存)、追記、エラー時(Java.illegalArgumentException : xxx contains a path separator) 対策について、実装例を上げていきます。

まず、ファイル 書き出し(保存)、追記について下記。

// 新規ファイルとしてファイル保存
// MODE_PRIVATE : 実装しているアプリのみからアクセス可能
public void writeTextToFile(String fileName, String text) {
    FileOutputStream fos = null;
    try {
        fos = openFileOutput(fileName, Context.MODE_PRIVATE);
        fos.write(text.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// 既存ファイルへ追記保存
// MODE_APPEND :追記モード
public void appendTextToFile(String fileName, String text) {
    FileOutputStream fos = null;
    try {
        fos = openFileOutput(fileName, Context.MODE_PRIVATE|Context.MODE_APPEND);
        fos .write(text.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}


これで実行時エラー(Java.illegalArgumentException : File xxx contains a path separator)が起きる場合がある
ローカル領域へ直保存する場合は問題ないが、ディレクトリ構造を持つ場合、このエラーが発生する

このエラーはFileOutputStreamインスタンスを次に修正すれば対応可能

// 新規ファイルとしてファイル保存
public void writeTextToFile(String fileName, String text) {
    FileOutputStream fos = null;
    try {
        //fos = openFileOutput(fileName, Context.MODE_PRIVATE);
        fos = new FileOutputStream(new File(fileName));
        fos.write(text.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// 既存ファイルへ追記保存
public void appendTextToFile(String fileName, String text) {
    FileOutputStream fos = null;
    try {
        //fos = openFileOutput(fileName, Context.MODE_PRIVATE|Context.MODE_APPEND);
        fos = new FileOutputStream(new File(fileName), true);
        fos .write(text.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

追記モードの設定は、FileOutputStreamの第2引数=trueで設定可能
ちなみに、追記モードはtextに改行コードを入れないと素直に文字が追加される


AndroidManifest.xmlパーミッション設定は忘れずに。

<manifest ...>
    ...
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>