我试图使用可序列化文件制作翻译器(它的作业),我确实编写了一个对象并且它有效,但是当我想在文件上有多个入口时它会产生标题错误,我使用自定义的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)
答案 0 :(得分:0)
因此,您已经编写了一个自定义ObjectOutputStream
派生类来删除流标题,现在您在读取丢失的流标题时遇到错误。你为什么惊讶?放回流标题,或完全删除您的课程。