Java 如何将类对象读/写到内部Android文件?
在这件事上坚持了几天,我觉得一切都很好。我目前甚至无法在Android设备监视器中看到正在创建的文件 我试图将事件对象一次写入一个文件,并在任何给定时间读回所有事件 事件类Java 如何将类对象读/写到内部Android文件?,java,android,serialization,Java,Android,Serialization,在这件事上坚持了几天,我觉得一切都很好。我目前甚至无法在Android设备监视器中看到正在创建的文件 我试图将事件对象一次写入一个文件,并在任何给定时间读回所有事件 事件类 public class Event implements Serializable { private static final long serialVersionUID = -29238982928391l; public String time; public String drug; public Date d
public class Event implements Serializable {
private static final long serialVersionUID = -29238982928391l;
public String time;
public String drug;
public Date date;
public int dose;
SimpleDateFormat format = new SimpleDateFormat("MM-dd");
public Event(Date date, String time, String drug, int dose){
this.time = time;
this.drug = drug;
this.date = date;
this.dose = dose;
}
事件类似乎
object.writeObject(oos)代码>应更改为oos.writeObject(对象)代码>
我想你已经在classEvent
中定义了名为readObject/writeObject
的方法。但是你应该知道这两个方法是由ObjectInputStream/ObjectOutputStream反射和调用的,你不应该直接从外部调用它(所以请将这两个方法设为私有)。似乎theObject.writeObject(oos);
应更改为oos.writeObject(theObject);
我认为您已经在类事件中定义了名为readObject/writeObject
的方法。但是您应该知道,这两个方法是由ObjectInputStream/ObjectOutputStream反射和调用的,您不应该直接从外部调用它(因此请将这两个方法设置为私有).将新对象附加到序列化文件将损坏该文件,因为它会为每个对象写入特定的元数据。有关详细信息,请访问
我建议使用另一种类型的序列化来存储对象。您可以使用JSON:
或者,由于您的对象格式非常简单,您甚至可以将其序列化为JSON,并在每个对象后使用唯一的分隔符逐个追加到文件中。要读取对象,您只需通过分隔符从此文件中拆分字符串
,并将每个JSON单独解析到您的对象。将新对象追加到序列化文件中会损坏它对于每个对象,它都会写入特定的元数据
我建议使用另一种类型的序列化来存储对象。您可以使用JSON:
或者,由于您的对象格式非常简单,您甚至可以将其序列化为JSON,并在每个对象后使用唯一的分隔符逐个附加到文件中。要读取对象,您只需使用分隔符从该文件中拆分String
,并将每个JSON分别解析到您的对象中。谢谢,我更改了您所说的内容,这可能会有所帮助。我似乎在我的日历上不断显示一个事件,而其他人不保存/加载。我明天需要仔细查看此内容。谢谢,我更改了您所说的内容,这可能会有所帮助。我的日历上似乎不断显示一个事件,而其他人不保存/加载。我明天需要仔细查看此内容。
public class Events {
ArrayList<Event> eventslist = new ArrayList<Event>();
String saveFileName = "calendarEvents.data";
Context context;
public Events(Context ctx) {
super();
context = ctx;
}
// Reads the events for a given day
public ArrayList<Event> readData(Date event_date) {
ArrayList<Event> dayEvents = new ArrayList<Event>();
for (Event entry : eventslist) {
Date d = entry.getDate();
if(d.compareTo(event_date) == 0){
dayEvents.add(entry);
}
}
return dayEvents;
}
public ArrayList<Event> readAllEvents() {
return eventslist;
}
//inserts an event into the array
// this is what calls save()
public int insertData(Date date, String time, String drug, int dose) {
Event e = new Event(date, time, drug, dose);
try {
save(saveFileName, e);
eventslist.add(e);
} catch (Exception ex){
ex.printStackTrace();
return -1;
}
return 1;
}
//My actual write function
public void save(String filename, Event theObject) {
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = context.openFileOutput(filename, Context.MODE_APPEND);
oos = new ObjectOutputStream(fos);
theObject.writeObject(oos);
oos.close();
fos.close();
} catch(IOException e){
e.printStackTrace();
}
}
//my read function, not called in this example
public ArrayList<Event> readFile(String filename, Context ctx) {
FileInputStream fis;
ObjectInputStream ois;
ArrayList<Event> ev = new ArrayList<Event>();
try {
fis = ctx.openFileInput(filename);
ois = new ObjectInputStream(fis);
while(true) {
try{
ois.readObject();
//ev.add();
} catch (NullPointerException | EOFException e){
e.printStackTrace();
ois.close();
break;
}
}
ois.close();
fis.close();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
return ev;
}