IllegalArgumentException: файл содержит разделитель пути Android

Я ищу в Google и не могу найти верный ответ на мой вопрос! мой вопрос такой же, как у него, но он хочет MODE_APPEND, и я хочу MODE_PRIVATE для моего файла. Как мне это сделать?

это мой код:

public boolean saveCustomButtonInfo (Context context, Vector<DocumentButtonInfo> info) throws Exception{
    String path= context.getFilesDir() + "/" + "Load";
    File file = new File(path);

    if(! file.exists()){
        file.mkdir();
        //Toast.makeText(context,file.getAbsolutePath(),Toast.LENGTH_LONG).show();
     }
    path=path+"/DocumentActivityCustomButtonsInfo.obj";
    try{
        FileOutputStream out=context.openFileOutput(path,Context.MODE_PRIVATE);
        ObjectOutputStream outObject=new ObjectOutputStream(out);
        outObject.writeObject(info);
        outObject.flush();
        out.close();
        outObject.close();
        return true;
    }catch(Exception ex){
        throw ex;

    }
}

1 ответ

Решение

Вы не можете использовать пути с косой чертой (/) с openFileOutput(), Что еще более важно, вы пытаетесь объединить оба getFilesDir() а также openFileOutput(), что является ненужным и вызывает эту проблему.

Измените свой код на:

public void saveCustomButtonInfo (Context context, List<DocumentButtonInfo> info) throws Exception {
    File dir = new File(context.getFilesDir(), "Load");

    if(! dir.exists()){
        dir.mkdir();
    }
    File f = new File(dir, "DocumentActivityCustomButtonsInfo.obj");
    FileOutputStream out=new FileOutputStream(f);
    ObjectOutputStream outObject=new ObjectOutputStream(out);
    outObject.writeObject(info);
    outObject.flush();
    out.getFD().sync();
    outObject.close();
}

Отметить:

  • Vector устарел в течение ~15 лет
  • Никогда не используйте конкатенацию для построения путей файловой системы; использовать правильное File конструктор
  • Нет смысла ловить исключение, а просто перебрасывать его
  • Нет смысла возвращать boolean это всегда true
  • Вызов getFD().sync() на FileOutputStream подтвердить, что все байты записаны на диск
Другие вопросы по тегам