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 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 FacebookArtículo relacionado - Java Exception
- Arreglar Java.Net.SocketException: error de tubería rota en Java
- Clase de excepción Java Throwable VS
- Comprender la excepción de tiempo de ejecución en Java
- Corrija la excepción Java.Net.BindException: la dirección ya está en uso: Bind
- El proceso de Java Gateway se cerró antes de enviar su número de puerto
- Excepción de entrada no válida en Java