Java 读取文件时出现可序列化标头错误

Java 读取文件时出现可序列化标头错误,java,serialization,header,serializable,Java,Serialization,Header,Serializable,我试着用一个可序列化的文件做一个翻译器(这是我的家庭作业),我确实写了一个对象,它工作了,但是当我想在文件上有多个入口时,它会给出一个标题错误,我使用了一个自定义的ObjectInputStreamClass,程序还在WIP中,这阻止了我完成它。 //主类 package basesYficheros; import java.io.*; import java.util.*; public class Ser3Main { static Scanner inNum = new Scanne

我试着用一个可序列化的文件做一个翻译器(这是我的家庭作业),我确实写了一个对象,它工作了,但是当我想在文件上有多个入口时,它会给出一个标题错误,我使用了一个自定义的ObjectInputStreamClass,程序还在WIP中,这阻止了我完成它。 //主类

package basesYficheros;

import java.io.*;
import java.util.*;

public class Ser3Main {
static Scanner inNum = new Scanner(System.in);
static Scanner inText = new Scanner(System.in);
static String ruta = "C:/Users/Richard/Desktop/diccionario.dat";

public static void main(String[] args) {
    int opcion = menu();

    switch (opcion) {
    case 1:
        MiObjectOutputStream escribir = crearArchivo(ruta);
        System.out.println("Introduce la palabra en español que quieras agregar");
        String esp = inText.next();
        Ser3Palabra pEsp = new Ser3Palabra(esp);
        // TODO comprobar que no existe
        System.out.println("Introduce su traducción");
        String ing = inText.next();
        Ser3Palabra pIng = new Ser3Palabra(ing);
        Ser3Trad conjunto = new Ser3Trad(pEsp, pIng);
        guardarTrad(conjunto, escribir);
        try {
            escribir.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        break;
    case 2:
        leerArchivo();

        break;

    default:
        break;
    }
}

private static int menu() {
    int opc = 0;
    while (opc < 1 | opc > 2) {
        System.out.println("Elige una opción\n" + "1.Agregar una traducción\n" + "2.Traducir una palabra");
        opc = inNum.nextInt();
    }
    return opc;

}

private static MiObjectOutputStream crearArchivo(String rutaArchivo) {
    try {

        File archivo = new File(rutaArchivo);

        MiObjectOutputStream escribir = new MiObjectOutputStream(new FileOutputStream(archivo));

        return escribir;

    } catch (IOException e) {
        System.out.println("Error I/O");

        System.exit(0);
    }
    return null;
} // FIN CREARARCHIVO

private static void guardarTrad(Ser3Trad trad, MiObjectOutputStream escribir) {

    try {

        escribir.writeObject(trad);

    } catch (IOException e) {

        System.out.println("Error I/O");

        System.exit(0);
    }

}

private static void leerArchivo() {

    File archivo = new File(ruta);

    boolean finalArchivo = false;

    try {

        ObjectInputStream leer=new ObjectInputStream(new FileInputStream(ruta));

        while (!finalArchivo) {
            Ser3Trad trad =(Ser3Trad) leer.readObject();
            System.out.println( trad);
        }
        leer.close();
        // para que salga del bucle
    } catch (ClassNotFoundException e) {
        System.out.println("clase no encontrada");
        finalArchivo = true;
    } catch (EOFException e) {
        System.out.println("Final del archivo");
        finalArchivo = true;
    } catch (FileNotFoundException e) {
        System.out.println("Archivo no encontrado");
        finalArchivo = true;
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Error I/O");
        System.exit(0);
    }

}
翻译课

package basesYficheros;

import java.io.Serializable;

public class Ser3Trad implements Serializable {
    Ser3Palabra español;
    Ser3Palabra inglés;
    public Ser3Palabra getEspañol() {
        return español;
    }
    public void setEspañol(Ser3Palabra español) {
        this.español = español;
    }
    public Ser3Palabra getInglés() {
        return inglés;
    }
    public void setInglés(Ser3Palabra inglés) {
        this.inglés = inglés;
    }
    public Ser3Trad(Ser3Palabra español, Ser3Palabra inglés) {
        super();
        this.español = español;
        this.inglés = inglés;
    }
    @Override
    public String toString() {
        return "Ser3Trad [español=" + español.getPalabra() + ", inglés=" + inglés.getPalabra() + "]";
    }

}
和我的自定义ObjectOutputStream以删除头

package basesYficheros;
import java.io.*;
//Esta clase hereda sus propiedades de ObjectOutputStream
public class MiObjectOutputStream extends ObjectOutputStream  {
    //Sobrescribimos el método que crea la cabecera
    protected void writeStreamHeader() throws IOException{
        // No hacer nada.
    }

    //Constructores
    public MiObjectOutputStream () throws IOException{
        super();
    }
    public MiObjectOutputStream(OutputStream out) throws IOException{
                super(out);
        }
错误如下所示

java.io.StreamCorruptedException: invalid stream header: 73720017
Error I/O
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at basesYficheros.Ser3Main.leerArchivo(Ser3Main.java:93)
at basesYficheros.Ser3Main.main(Ser3Main.java:34)
java.io.StreamCorruptedException:无效的流头:73720017
错误I/O
位于java.io.ObjectInputStream.readStreamHeader(未知源)
位于java.io.ObjectInputStream。(未知源)
在basesYficheros.Ser3Main.leerArchivo(Ser3Main.java:93)
在basesYficheros.Ser3Main.main(Ser3Main.java:34)

因此,您编写了一个自定义的
ObjectOutputStream
派生类来删除流头,现在您在读取缺少的流头时出错。你为什么感到惊讶?放回流标题,或者完全删除类

java.io.StreamCorruptedException: invalid stream header: 73720017
Error I/O
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at basesYficheros.Ser3Main.leerArchivo(Ser3Main.java:93)
at basesYficheros.Ser3Main.main(Ser3Main.java:34)