java - 如何使用可序列化将类对象存储到内部存储器中?

标签 java android serialization objectoutputstream

我需要将此对象存储到手机的内部存储器中,并且我有 <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"></uses-permission>设置在 list 上。对象本身有两个静态方法用于存储和从内部内存中重新加载它:

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;
}
}

我正在尝试存储它并在我的 Activity 中使用此调用重新打开它:

            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.harmony.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)

代码有什么问题?

谢谢

最佳答案

改变这个

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

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

正如@e-x 正确指出的那样,不会通过清除应用程序数据或卸载应用程序来删除文件

关于java - 如何使用可序列化将类对象存储到内部存储器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9836663/

相关文章:

time - Java时间晚一小时

android -/usr/lib/x86_64-linux-gnu/libQt5Core.so.5 : version `Qt_5.7' not found (required by emulator64-x86)

java - Listview 长按要删除的项目时出错

php - 在 mysql_fetch_array 之前序列化?

java - 如何分配 <s :property value ="a"> value to a jsp variable

java - 将数据保存在缓存、位置的技术?

java - 使用 SSLSockets 的正确方法是什么?为什么会收到这些错误?

android - ConnectivityManager Networkcallback 在没有互联网连接的情况下无法捕捉到 wifi 网络的连接

c# - 如何使用 XmlSerializer 获取 XML 元素的内容?

java - 我在哪里更改 Eclipse 中的设置,以便它为可序列化类生成 serialVersionUID?