Как сохранить объект класса во внутренней памяти, используя сериализуемый?

Мне нужно сохранить этот объект во внутренней памяти телефона, и у меня есть<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"></uses-permission> установить на манифест. Сам объект имеет два статических метода для хранения и перезагрузки его из внутренней памяти:

public class SaveState implements Serializable {
static public List<FullMagazine> fms = new ArrayList<FullMagazine>();
static SaveState instance=null;

public static SaveState getInstance(){      
    if( instance == null )
        instance = new SaveState();     
    return instance;
}

public static void saveData(SaveState instance){
    ObjectOutput out;
    try {
        out = new ObjectOutputStream(new FileOutputStream("appSaveState.data"));        
        out.writeObject(instance);
        out.close();
    } catch (Exception e) {e.printStackTrace();}
}

public static SaveState loadData(){
    ObjectInput in;
    SaveState ss=null;
    try {
        in = new ObjectInputStream(new FileInputStream("appSaveState.data"));       
        ss=(SaveState) in.readObject();
        in.close();
    } catch (Exception e) {e.printStackTrace();}
    return ss;
}
}

Я пытаюсь сохранить его и снова открыть с помощью этого вызова в моей деятельности:

            SaveState.fms.add(fm);
            SaveState.saveData(SaveState.getInstance());                
            SaveState sv = SaveState.loadData();

Но он не работает, он не хранит объект, и, конечно же, он не читает объект, я получаю эти два исключения при сохранении и чтении объекта:

    03-23 09:18:16.702: WARN/System.err(9060): java.io.FileNotFoundException: /appSaveState.data (Read-only file system)
03-23 09:18:16.702: WARN/System.err(9060):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
03-23 09:18:16.702: WARN/System.err(9060):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
03-23 09:18:16.702: WARN/System.err(9060):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
03-23 09:18:16.702: WARN/System.err(9060):     at java.io.FileOutputStream.<init>(FileOutputStream.java:168)
03-23 09:18:16.702: WARN/System.err(9060):     at java.io.FileOutputStream.<init>(FileOutputStream.java:147)
03-23 09:18:16.702: WARN/System.err(9060):     at com.Magazine.SaveState.saveData(SaveState.java:35)
03-23 09:18:16.702: WARN/System.err(9060):     at com.Magazine.MainMenu$DownloadThread.run(MainMenu.java:807)
03-23 09:18:16.709: WARN/System.err(9060): java.io.FileNotFoundException: /appSaveState.data (No such file or directory)
03-23 09:18:16.709: WARN/System.err(9060):     at org.apache.harmo,ny.luni.platform.OSFileSystem.openImpl(Native Method)
03-23 09:18:16.709: WARN/System.err(9060):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
03-23 09:18:16.709: WARN/System.err(9060):     at java.io.FileInputStream.<init>(FileInputStream.java:82)
03-23 09:18:16.709: WARN/System.err(9060):     at java.io.FileInputStream.<init>(FileInputStream.java:134)
03-23 09:18:16.709: WARN/System.err(9060):     at com.Magazine.SaveState.loadData(SaveState.java:46)
03-23 09:18:16.709: WARN/System.err(9060):     at com.Magazine.MainMenu$DownloadThread.run(MainMenu.java:809)

Что не так в коде?

Спасибо

 Sharp Edge02 сент. 2016 г., 18:27
Есть ли класс, используемый в статическом списке,FullMagazine также реализует Сериализуемый?
 M Hornbacher10 июн. 2016 г., 01:29
Проблема в том, что вы пытаетесь писать в /, который только для чтения в Android.

Ответы на вопрос(3)

вы получаете это разрешение). Попробуйте с внешним sd или вашимпапка кеша вместо.

 Tim23 мар. 2012 г., 10:32
File cacheFile = новый файл (activity.getCacheDir (), "appSaveState.data"); - напишите в этот файл, как вы делали раньше.
 Saeid Yazdani03 июл. 2014 г., 03:43
Cachefolder подвержен удалению ОС, когда свободного места становится мало!
 NullPointerException23 мар. 2012 г., 10:28
Данные из кэша сохраняются до тех пор, пока приложение не будет удалено с телефона? подскажите, пожалуйста, как это сделать с папкой кеша, что я должен изменить в своем коде?
Решение Вопроса

изменить это

out = new ObjectOutputStream(new FileOutputStream("appSaveState.data"));

с участием

   File outFile = new File(Environment.getExternalStorageDirectory(), "appSaveState.data");
   out = new ObjectOutputStream(new FileOutputStream(outFile)); 

как правильно указано @ e-x, файл не будет удален, очистив данные приложения или удалив приложение

 Blackbelt23 мар. 2012 г., 10:36
если вы имеете в виду мобильные телефоны без поддержки sdcard (например, samsung nexus s), Enviromenet.getExternalStorageDirectory () вернет путь к архиву внутренней памяти телефона.
 NullPointerException23 мар. 2012 г., 10:29
и что будет, если на телефоне не установлена SDCARD? я пытаюсь сохранить его во внутренней памяти, потому что я должен хранить эти данные на всех телефонах, включая телефоны без SDCARD
 E_X26 сент. 2014 г., 12:43
Я думаю, что стоит упомянуть, что если в телефоне есть SDCARD, то файл останется при очистке данных приложения.
 Blackbelt26 сент. 2014 г., 12:53
@E_X, я обновил ответ, спасибо за вклад

это

Я написал это в своем классе пользователя

private static File mFolder;
public void saveData(Activity pContext) {
    //this could be initialized once onstart up
    if(mFolder == null){
        mFolder = pContext.getExternalFilesDir(null);
    }
    this.save();
    ObjectOutput out;
    try {
        File outFile = new File(mFolder,
                "someRandom.data");
        out = new ObjectOutputStream(new FileOutputStream(outFile));
        out.writeObject(this);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static User loadData(Context pContext) {
    if(mFolder == null){
        mFolder = pContext.getExternalFilesDir(null);
    }
    ObjectInput in;
    User lUser = null;
    try {
        FileInputStream fileIn = new FileInputStream(mFolder.getPath() + File.separator + "someRandom.data");
        in = new ObjectInputStream(fileIn);
        lUser = (User) in.readObject();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (lUser != null) {
        lUser.save();
        Log.d("current User: ", lUser.nickname);
    } else {
        Log.d("current User: ", "null");
    }
    return lUser;
}

Редактировать:

Потом из своей деятельности звоню

mUser = User.loadData(mSelf);

или же

mUser = User.loadData(this);

mSelf будет экземпляром, который я храню

Надеюсь это поможет :)

Ваш ответ на вопрос