如何读取/写入类对象到内部Android文件?

时间:2016-02-26 06:43:04

标签: java android serialization

已经坚持了几天,这对我来说似乎都是对的。我目前甚至无法在Android设备监视器中看到正在创建的文件。

我正在尝试将一个事件对象一次写入一个文件,并在任何给定时间回读所有事件。

活动类

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

事件类< - 控制所有事件,此类由我的MainActivity类使用

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;



}

2 个答案:

答案 0 :(得分:0)

似乎theObject.writeObject(oos);应更改为oos.writeObject(theObject);

我认为你已经在类readObject/writeObject中定义了名为Event的方法。但是你应该知道的是这两种方法是由ObjectInputStream / ObjectOutputStream反映和调用的,你不应该直接从外部调用它(所以请将这两种方法设为私有。)

答案 1 :(得分:0)

将新对象附加到序列化文件将损坏它会导致每个对象写入特定元数据。您可以在Object Serialization Stream Protocol了解更多相关信息。

我建议使用其他类型的序列化来存储对象。您可以使用JSON:How to insert one more item in a json existing structure with gson?

执行此操作

或者,由于您的对象格式非常简单,您甚至可以将其序列化为JSON,并在每个对象之后逐个追加到文件中,并使用唯一的分隔符。要读取对象,您应该通过分隔符从此文件中分割id,并将每个JSON分别解析到您的对象。