-2

im trying to make a translator (it's homework) using a serializable file, I did write one object and it worked, but when I want to have multiple entrances on the file it gives a header error, I use a custom ObjectInputStreamClass and the program is WIP yet and this stops me from finishing it. //Main class

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

}

Word class

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

The translate class

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() + "]";
    }

}

And my custom ObjectOutputStream in order to remove the headers

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

The error is the following

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)
user207421
  • 305,947
  • 44
  • 307
  • 483

1 Answers1

0

So you've written a custom ObjectOutputStream derived class to remove the stream header, and now you're getting an error reading the missing stream header. Why are you surprised? Put back the stream header, or remove your class altogether.

user207421
  • 305,947
  • 44
  • 307
  • 483