Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将对象读写到android文件(ObjectOutput/InputStream)_Java_Android_Objectinputstream_Objectoutputstream - Fatal编程技术网

Java 将对象读写到android文件(ObjectOutput/InputStream)

Java 将对象读写到android文件(ObjectOutput/InputStream),java,android,objectinputstream,objectoutputstream,Java,Android,Objectinputstream,Objectoutputstream,我试图从一个文件中读取对象并将它们添加到一个向量中,但我一直得到一个错误,我不知道为什么。 以下是阅读功能: public Vector<Paciente> listaPacientes (int cantidad){ Vector<Paciente> result= new Vector<Paciente>(); try{ FileInputStream f=context.openFileInput(FICHERO);

我试图从一个文件中读取对象并将它们添加到一个向量中,但我一直得到一个错误,我不知道为什么。 以下是阅读功能:

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-0219:21:46.365:E/历史临床医生(32309):格式错误:ac
08-02 19:21:46.365:E/Historial Clinico(32309):java.io.StreamCorruptedException:格式错误:ac
08-02 19:21:46.365:E/历史临床医生(32309):在java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:701)
08-02 19:21:46.365:E/Historial Clinico(32309):位于java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:814)
08-02 19:21:46.365:E/Historial Clinico(32309):位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
08-02 19:21:46.365:E/Historial Clinico(32309):位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
08-02 19:21:46.365:E/Historial Clinico(32309):在com.example.historicalinica.PacientestoFile.listapatientes(PacientestoFile.java:60)
08-02 19:21:46.365:E/Historial Clinico(32309):在com.example.historicalinica.cListaPacientes.onCreate(cListaPacientes.java:17)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.Activity.performCreate(Activity.java:5372)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2359)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.ActivityThread.access$700(ActivityThread.java:165)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326)
08-02 19:21:46.365:E/Historial Clinico(32309):在android.os.Handler.dispatchMessage(Handler.java:99)上
08-02 19:21:46.365:E/历史临床医生(32309):在android.os.Looper.loop(Looper.java:137)
08-02 19:21:46.365:E/Historial Clinico(32309):位于android.app.ActivityThread.main(ActivityThread.java:5455)
08-02 19:21:46.365:E/Historial Clinico(32309):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-02 19:21:46.365:E/Historial Clinico(32309):位于java.lang.reflect.Method.invoke(Method.java:525)
08-02 19:21:46.365:E/Historial Clinico(32309):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
08-02 19:21:46.365:E/Historial Clinico(32309):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
08-02 19:21:46.365:E/历史临床医生(32309):在dalvik.system.NativeStart.main(本机方法)


发生EOFEException是因为您到达了文件的末尾。这很正常。抓住它并打破它。您的代码似乎假定readObject()在文件末尾返回null。没有。如果您写入null,它将返回null。

看起来您正在读取由早期版本的代码生成的文件,该代码没有附加流。我已经尝试重命名该文件并删除现有文件,但两种方式都不起作用。哦,我再次尝试重命名该文件,但现在出现了EOFEException错误不一定,你可以在外面接住它,这样可以省去“休息”的时间。你能给我举个我应该如何使用它的例子吗?请