Java.IO.StreamCorruptedException: encabezado de flujo no válido

Sheeraz Gul 12 octubre 2023
Java.IO.StreamCorruptedException: encabezado de flujo no válido

Este tutorial demuestra cómo solucionar la excepción java.io.StreamCorruptedException: encabezado de flujo no válido de Java.

java.io.StreamCorruptedException: encabezado de flujo no válido en Java

La excepción java.io.StreamCorruptedException: encabezado de flujo no válido es una excepción relativamente común. Para comprender el motivo de esta excepción, necesitamos ver el encabezado de flujo no válido en la excepción porque puede explicar el motivo del problema.

La StreamCorruptedException tiene dos constructores, el primero con un argumento y el otro sin argumentos. El que acepta los argumentos describe las razones de la excepción.

La excepción java.io.StreamCorruptedException: encabezado de flujo no válido: XXXXXX es la excepción con el argumento donde XXXXXX representa los detalles del encabezado no válido.

Esta excepción ocurre comúnmente cuando estamos trabajando con ObjectInputStream. Porque, según el Javadoc, solo se pueden leer los objetos de flujos que admitan java.io.Serializable o java.io.Externalizable.

Entonces, cada vez que usamos el ObjectInputStream, debe usarse con los datos serializados. La mayor parte de la StreamCorruptedException: encabezado de flujo no válido ocurre cuando un archivo como texto, HTML, XML, JSON, etc., se pasa directamente al constructor ObjectInputStream en lugar de un archivo serializable.

Aquí hay algunos java.io.StreamCorruptedException: encabezado de flujo no válido que ocurren comúnmente con los valores ASCII correspondientes.

Valor hexadecimal para encabezado de flujo no válido Enteros para HEX Valores ASCII para HEX
54657374 084 101 115 116 Test
48656C6C 072 101 108 108 Hell
54656D70 084 101 109 112 Temp
4920616D 073 032 097 109 “Soy”
54686973 084 104 105 115 This
20646520 032 100 101 032 de
30313031 048 049 048 049 0101
32303138 050 048 049 056 2018
41434544 065 067 069 068 ACED
64617364 100 097 115 100 dasd
72657175 114 101 113 117 requ
7371007E 115 113 000 126 cuadrado ~
70707070 112 112 112 112 pppp
77617161 119 097 113 097 waqa
7B227061 123 034 112 097 {"pa
3C21444F 060 033 068 079 <!DO
3C787364 060 120 115 100 <xsd
0A0A3C68 010 010 060 104 <h
3c48544d 060 072 084 077 <HTM
3C6F626A 060 111 098 106 <obj
00000000 000 000 000 000
0A0A0A0A 010 010 010 010

Probemos un ejemplo que arrojará la excepción java.io.StreamCorruptedException: encabezado de flujo no válido. Ver ejemplo:

package delftstack;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class Example {
  private static ServerSocket Server_Socket;
  private static int Port_Number = 5000;

  public static void main(String args[]) throws IOException, ClassNotFoundException {
    Server_Socket = new ServerSocket(Port_Number);
    while (true) {
      System.out.println("Waiting for client request");
      // create socket and then wait for client connection
      Socket DemoSocket = Server_Socket.accept();
      // read from socket to the ObjectInputStream object
      ObjectInputStream Object_Input_Stream = new ObjectInputStream(DemoSocket.getInputStream());
      // convert the ObjectInputStream to the String
      String DemoMessage = (String) Object_Input_Stream.readObject();
      System.out.println("The Received Message is: " + DemoMessage);
      // ObjectOutputStream object
      ObjectOutputStream Object_Output_Stream =
          new ObjectOutputStream(DemoSocket.getOutputStream());
      // write object to the Socket
      Object_Output_Stream.writeObject("Hello Client " + DemoMessage);
      // close
      Object_Input_Stream.close();
      Object_Output_Stream.close();
      DemoSocket.close();
      // terminate the server on exit from the client
      if (DemoMessage.equalsIgnoreCase("exit"))
        break;
    }
    System.out.println("Shut down Socket server!!");
    // close the ServerSocket
    Server_Socket.close();
  }
}

El código anterior intenta leer una cadena enviada por el cliente. El resultado de este código es la excepción java.io.StreamCorruptedException: encabezado de flujo no válido.

Ver salida:

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 54657374
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at Example.main(SocketServerExample.java:29)

El motivo de esta excepción es que no enviamos los datos utilizando ObjectOutputStream porque no podemos esperar que ObjectOutputStream convierta texto en objetos automáticamente; el valor hexadecimal 54657374 se convierte a Test como texto, y debemos estar enviándolo directamente como bytes.

Podemos usar los métodos readObject() y writeObject() para resolver este problema.

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java Exception