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)