Java.IO.StreamCorruptedException: 잘못된 스트림 헤더

Sheeraz Gul 2023년10월12일
Java.IO.StreamCorruptedException: 잘못된 스트림 헤더

이 자습서는 Java의 java.io.StreamCorruptedException: 잘못된 스트림 헤더 예외를 수정하는 방법을 보여줍니다.

Java에서 java.io.StreamCorruptedException: 잘못된 스트림 헤더

java.io.StreamCorruptedException: 잘못된 스트림 헤더는 상대적으로 일반적인 예외입니다. 이 예외의 이유를 이해하려면 예외에서 잘못된 스트림 헤더를 확인해야 합니다. 문제의 원인을 설명할 수 있기 때문입니다.

StreamCorruptedException에는 두 개의 생성자가 있습니다. 첫 번째는 하나의 인수가 있고 다른 하나는 인수가 없습니다. 인수를 수락하는 사람은 예외에 대한 이유를 설명합니다.

java.io.StreamCorruptedException: 잘못된 스트림 헤더: XXXXXXXXXXXX가 잘못된 헤더 세부 정보를 나타내는 인수가 있는 예외입니다.

이 예외는 일반적으로 ObjectInputStream으로 작업할 때 발생합니다. Javadoc에 따라 java.io.Serializable 또는 java.io.Externalizable을 지원하는 스트림에서 해당 객체만 읽을 수 있기 때문입니다.

따라서 ObjectInputStream을 사용할 때마다 직렬화된 데이터와 함께 사용해야 합니다. 대부분의 StreamCorruptedException: 잘못된 스트림 헤더는 텍스트, HTML, XML, JSON 등과 같은 파일이 직렬화 가능한 파일이 아닌 ObjectInputStream 생성자에 직접 전달될 때 발생합니다.

다음은 해당 ASCII 값과 함께 일반적으로 발생하는 java.io.StreamCorruptedException: 잘못된 스트림 헤더입니다.

잘못된 스트림 헤더의 HEX 값 HEX의 정수 HEX의 ASCII 값
54657374 084 101 115 116 Test
48656C6C 072 101 108 108 Hell
54656D70 084 101 109 112 Temp
4920616D 073 032 097 109 “그래요”
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 제곱 ~
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

java.io.StreamCorruptedException: 잘못된 스트림 헤더 예외를 발생시키는 예제를 시도해 보겠습니다. 예를 참조하십시오:

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();
  }
}

위의 코드는 클라이언트에서 보낸 문자열을 읽으려고 합니다. 이 코드의 출력은 java.io.StreamCorruptedException: 잘못된 스트림 헤더 예외입니다.

출력 참조:

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)

이 예외의 이유는 ObjectOutputStream이 자동으로 텍스트를 객체로 변환할 것으로 기대할 수 없기 때문에 ObjectOutputStream을 사용하여 데이터를 전송하지 않기 때문입니다. 16진수 값 54657374는 텍스트로 Test로 변환되며 바이트로 직접 전송해야 합니다.

이 문제를 해결하기 위해 readObject()writeObject() 메서드를 사용할 수 있습니다.

작가: Sheeraz Gul
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

관련 문장 - Java Exception