读取文件时可序列化的标头错误

时间:2017-06-07 23:44:52

标签: java serialization header serializable

我试图使用可序列化文件制作翻译器(它的作业),我确实编写了一个对象并且它有效,但是当我想在文件上有多个入口时它会产生标题错误,我使用自定义的ObjectInputStreamClass和该程序尚未完成,这使我无法完成它。     //主要课程

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 Ser3Palabra implements Serializable {
    String palabra;
    public String getPalabra() {
    return palabra;
    }
    public void setPalabra(String palabra) {
        this.palabra = palabra;
    }

    public Ser3Palabra(String palabra) {
        this.palabra = palabra;
     }}

翻译班

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)

1 个答案:

答案 0 :(得分:0)

因此,您已经编写了一个自定义ObjectOutputStream派生类来删除流标题,现在您在读取丢失的流标题时遇到错误。你为什么惊讶?放回流标题,或完全删除您的课程。