如何将ArrayList <MyObject>保存到文件?

用户44651

如何将ArrayList保存到文件?我在做什么

我已经使用了这个SO问题来帮助我处理可序列化的对象。

如何在Android上序列化ArrayList

我用这个SO问题来写数组列表:

Java-如何将ArrayList写入文件,然后将该文件读取(加载)到原始ArrayList?

但是,当我尝试将写入文件时,出现错误:

java.io.NotSerializableException:在

java.io.ObjectOutputStream.writeObject位于

com.mycompany.MyClass.saveData

这是试图保存文件的MyClass

private ArrayList < MyCustomObject > arrayList;
private File dataFile;
private String FILE_NAME = "FILE_DATA.dat";

public void init(final Context context) {
    this.appContext = context;

    dataFile = new File(appContext.getFilesDir(), FILE_NAME);

    if (dataFile.exists()) {
        loadData();

    } else {

        try {
            dataFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        arrayList = new ArrayList < MyCustomObject > ();
saveData();
   }

}


private void saveData() {
    FileOutputStream fos = null;

    try {
        fos = new FileOutputStream(dataFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {

        if (fos != null) {

            ObjectOutputStream oos = null;
            try {

                oos = new ObjectOutputStream(fos);

                if (oos != null) {

                    oos.writeObject(arrayList);

                }
                assert oos != null;
                oos.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

private void loadData() {

    FileInputStream fis = null;
    try {
        fis = new FileInputStream(dataFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {

        if (fis != null) {

            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(fis);

                if (ois != null) {

                    try {

                        arrayList = (ArrayList < MyCustomObject > ) ois.readObject();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {

                }
                assert ois != null;
                ois.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

这是MyCustomObject

public class MyCustomObject implements Serializable {

    public String myname = "";
    public String someOtherItem = "";
    public int aNumber = 0;
    public MyCustomObject getCustomObject() {
        return this;
    }
}
阿兰洛波

替换此方法

 public MyCustomObject MyCustomObject() {
        return this;
 }

在您的MyCustomObject类中,您的代码应该可以正常工作。使用类似

 public MyCustomObject getMyCustomObject() {
        return this;
 }

因为您命名方法的方式与Java为MyCustomObject类创建的默认构造函数冲突,而您自己没有提供构造函数。我假设您正在使用此方法将MyCustomObject的实例添加到您的数组列表中:您实际上并不需要这种方法,但是使用正确的命名后,您仍然可以使用它。

您还应该通过调用saveData()方法将样本数据放入ArrayList中,然后再将其保存到磁盘中。

这是您的代码中的有效示例。我不确定您的Context对象到底是什么,但是您正在使用它来访问文件路径,因此为了使事情顺利进行,我只使用了特定的文件路径。

public class MyClass {
    private ArrayList < MyCustomObject > arrayList;
    private File dataFile;
    private String FILE_NAME = "FILE_DATA.dat";

    public void init(final Context context) {


        dataFile = new File("C:\\lompo\\file1.txt");

        if (dataFile.exists()) {
            loadData();

        } else {

            try {
                dataFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            arrayList = new ArrayList < MyCustomObject > ();
            MyCustomObject obj1 = new MyCustomObject();
            obj1.aNumber = 125;
            obj1.myname = "HIS NAME";
            arrayList.add(obj1);
            saveData();
       }

    }

    public static void main(String[] args) {
        MyClass myClazz = new MyClass();
        myClazz.init(null);

        System.out.println("Arraylist has " + myClazz.arrayList.size() + " elements");
    }

    private void saveData() {
        FileOutputStream fos = null;

        try {
            fos = new FileOutputStream(dataFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {

            if (fos != null) {

                ObjectOutputStream oos = null;
                try {

                    oos = new ObjectOutputStream(fos);

                    if (oos != null) {

                        oos.writeObject(arrayList);

                    }
                    assert oos != null;
                    oos.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    private void loadData() {

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(dataFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {

            if (fis != null) {

                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(fis);

                    if (ois != null) {

                        try {

                            arrayList = (ArrayList < MyCustomObject > ) ois.readObject();
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                    } else {

                    }
                    assert ois != null;
                    ois.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

正如您在代码中看到的那样,main方法的第一次运行会将文件保存在磁盘上,该磁盘具有由一个对象填充的arrayList。第二次运行从文件读取,然后我打印了之前保存的元素数量和信息:图片说明了结果

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

  1. 1

    来自Microsoft Office加载项taskpane.js的MySQL驱动程序模块的空引用

  2. 2

    使用AWS Cognito和React的仅限Facebook / Google的登录名(无用户名/密码)

  3. 3

    创建Windows Phone 8应用并将其连接到数据库的最佳方法(最好是SQL Server)

  4. 4

    为什么Java中的System.out.println()打印到控制台?

  5. 5

    卷曲函数无法解析来自bash中变量的代理

  6. 6

    是什么在Android的consumer-rules.pro和proguard-rules.pro之间的区别?

  7. 7

    设置与Apache POI Excel表散点图标记图标的颜色

  8. 8

    将Qt Pyside2与asyncio await语法一起使用?

  9. 9

    崇高的文字+蟒蛇的蟒蛇

  10. 10

    任务':app:minifyReleaseWithR8'.java.lang.NullPointerException的执行失败(无错误消息)

  11. 11

    OpenJDK的和AdoptOpenJDK的区别

  12. 12

    大型数据集缓存到Spark内存中时,“超出了GC开销限制”(通过sparklyr和RStudio)

  13. 13

    “执行测试CMAKE_HAVE_LIBC_PTHREAD”失败实际上是什么意思?

  14. 14

    使用Core 2.2中的Identity,如何在关闭浏览器15分钟后保持会话活动?

  15. 15

    React中的ForwardRefExoticComponent和ForwardRefRenderFunction有什么区别?

  16. 16

    猫鼬查找结果,然后将字段替换为findOne

  17. 17

    如何降级Google Colab的Torch版本

  18. 18

    Keras提前停止回调错误,val_loss指标不可用

  19. 19

    如何避免VSCode中的“导入路径不能以.ts扩展名结尾”错误?

  20. 20

    Nuxt.JS:如何在页面中获取路由URL参数

  21. 21

    是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

热门标签

归档