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