java.io.StreamCorruptedException: código de tipo no válido: solución al error de CA

Java Io Streamcorruptedexception

Descripción del problema:

Al escribir un objeto serializable en un archivo, solo desea agregar un objeto serializable al final del archivo, por lo que usa FileOutputStream (nombre de archivo, verdadero) para construir indirectamente el objeto de flujo ObjectOutputStream, leerlo. Cuando los datos se ejecutan por primera vez, no informarán de un error. En la segunda vez, informará java.io.StreamCorruptedException: código de tipo no válido: error de CA.



la razón:



En un archivo hay un encabezado y un cuerpo de archivo. Dado que el objeto ObjectOutputStream construido con FileOutputStream (nombre de archivo, verdadero) escribe datos varias veces en el mismo archivo, cada vez que se escriben datos, escribirá el encabezado al final del archivo para escribir los datos del objeto que desea escribir. Cuando encuentre este encabezado en el cuerpo del archivo, obtendrá un error. Cuando ocurre una lectura, ocurre una excepción de flujo de datos (la información de control en el flujo es inconsistente).
Solo la continuación se escribirá primero en el encabezado. Si no es una continuación, escribir en varios objetos solo escribirá el encabezado del archivo una vez. Incluso si se escriben varios objetos en una continuación, solo se escribirá una vez el encabezado del archivo.



Reserva de conocimiento:
Cada archivo tiene un encabezado y un cuerpo de archivo.
Hay un método protegido writeStreamHeader (): void en el flujo de salida del objeto (ObjectOutputStream), que es específicamente para escribir el encabezado del archivo.

Solución: Entonces aquí para determinar si es la primera vez que se escribe un archivo, si está escrito en el encabezado, de lo contrario no se escribe.

Ejemplo de código:



import java.io.* public class MyObjectOutputStream extends ObjectOutputStream{ public MyFileOutputStream(){ super() } public MyFileOutputStream(OutputStream o){ super(o) } public void writeStreamHeader(){}/ / This overrides the method in the parent class, so that he does not write to the file header when calling writeObject() } class Demo{ public static void main(String[] args){ File file=new File(xxxxxxx) ObjectOutputStream out / / Determine whether the file exists to determine which objectoutputstream to use if(file.isFile()){ out=new MyObjectOutputStream(xxxx) } else{ out=new ObjectOutputStream(xxxxx) } } } $ (function () {$ ('pre.prettyprint code'). each (function () {var lines = $ (this) .text (). split (' n'). length var $ numbering = $ ('
    ') .addClass (' pre-numeración '). hide () $ (this) .addClass (' tiene-numeración '). parent (). append ($ numeración) para (i = 1 i<= lines i++) { $numbering.append($('
  • ') .text (i))} $ numbering.fadeIn (1700)})})