Чтение и запись объектов в файл Android (ObjectOutput/InputStream)

Я пытаюсь прочитать объекты из файла и добавить их в вектор, но постоянно получаю сообщение об ошибке и не могу понять, почему. Вот функция чтения:

public Vector<Paciente> listaPacientes (int cantidad){
    Vector<Paciente> result= new Vector<Paciente>();
    try{
        FileInputStream f=context.openFileInput(FICHERO);
        ObjectInputStream is = new ObjectInputStream(f);
        int n=0;
        Paciente pac;
        do{
            pac=(Paciente) is.readObject();
            if(pac!=null){
                result.add(pac);
                n++;
                Log.d("Número n","n="+n);
            }
        }while(n<cantidad && pac!=null);
        f.close();
    }catch(Exception e){
        Log.e("Historial Clinico", e.getMessage(),e);
    }
    return result;
}

И функция записи:

    public void guardarPacientes(Paciente pac){
    File file=new File(FICHERO);
    if(file.exists()){
        try {
            FileOutputStream fi = context.openFileOutput(FICHERO, Context.MODE_APPEND);
            AppendingObject os=new AppendingObject(fi);
            os.writeObject(os);
            os.flush();
            os.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    else
    {
        try{
            FileOutputStream f=context.openFileOutput(FICHERO, Context.MODE_APPEND);
            ObjectOutputStream os = new ObjectOutputStream(f);
            os.writeObject(pac);
            os.flush();
            os.close();
        }catch (Exception e){
            Log.e("Historial Clinico",e.getMessage(),e);
        }
    }
}

Как видите, я создаю экземпляр из другого класса, если файл уже существует, чтобы избежать заголовка. Итак, вот еще один класс:

public class AppendingObject extends ObjectOutputStream{

public AppendingObject(OutputStream out) throws IOException {
    super(out);
  }

  @Override
  protected void writeStreamHeader() throws IOException {
    reset();
  }

Вот ошибка:

08-02 19:21:46.365: E/Historial Clinico(32309): Wrong format: ac 08-02 19:21:46.365: E/Historial Clinico(32309): java.io.StreamCorruptedException: Wrong format: ac 08-02 19:21:46.365: E/Historial Clinico(32309): at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:701) 08-02 19:21:46.365: E/Historial Clinico(32309): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:814) 08-02 19:21:46.365: E/Historial Clinico(32309): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006) 08-02 19:21:46.365: E/Historial Clinico(32309): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963) 08-02 19:21:46.365: E/Historial Clinico(32309): at com.example.historiaclinica.PacientestoFile.listaPacientes(PacientestoFile.java:60) 08-02 19:21:46.365: E/Historial Clinico(32309): at com.example.historiaclinica.cListaPacientes.onCreate(cListaPacientes.java:17) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.Activity.performCreate(Activity.java:5372) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2359) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.ActivityThread.access$700(ActivityThread.java:165) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.os.Handler.dispatchMessage(Handler.java:99) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.os.Looper.loop(Looper.java:137) 08-02 19:21:46.365: E/Historial Clinico(32309): at android.app.ActivityThread.main(ActivityThread.java:5455) 08-02 19:21:46.365: E/Historial Clinico(32309): at java.lang.reflect.Method.invokeNative(Native Method) 08-02 19:21:46.365: E/Historial Clinico(32309): at java.lang.reflect.Method.invoke(Method.java:525) 08-02 19:21:46.365: E/Historial Clinico(32309): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 08-02 19:21:46.365: E/Historial Clinico(32309): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 08-02 19:21:46.365: E/Historial Clinico(32309): at dalvik.system.NativeStart.main(Native Method)


person osvaldortega    schedule 03.08.2014    source источник
comment
Похоже, вы читаете из файла, созданного из более ранней версии кода, в котором не было присоединяемого потока.   -  person user207421    schedule 03.08.2014
comment
Я уже пробовал переименовывать файл и удалять существующие, но это ни в коем случае не работает.   -  person osvaldortega    schedule 03.08.2014
comment
О, я попытался снова переименовать файл, но теперь я получил ошибку EOFException   -  person osvaldortega    schedule 03.08.2014


Ответы (1)


Исключение EOFException возникает из-за того, что вы добрались до конца файла. Это нормально. Поймать и разбить. Ваш код, кажется, предполагает, что readObject() возвращает null в конце файла. Это не так. Он возвращает null, если вы написали null.

person user207421    schedule 03.08.2014
comment
Не обязательно, вы можете поймать его снаружи, что сэкономит «перерыв». - person user207421; 03.08.2014
comment
Не могли бы вы привести пример того, как я должен его использовать? пожалуйста - person osvaldortega; 03.08.2014