【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>