gpt4 book ai didi

java - 如何将 ArrayList 保存到文件中?

转载 作者:行者123 更新时间:2023-11-30 00:53:33 25 4
gpt4 key购买 nike

如何将 ArrayList 保存到文件中?我做错什么了?

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

how to serialize ArrayList on android

我用了这个关于如何编写数组列表的 SO 问题:

Java - How Can I Write My ArrayList to a file, and Read (load) that file to the original ArrayList?

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

java.io.NotSerializableException: at

java.io.ObjectOutputStream.writeObject at

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。第二次运行从文件中读取,然后我打印了元素的数量和我之前保存的信息:图片说明了结果

enter image description here

关于java - 如何将 ArrayList<MyObject> 保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40552851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com