Java.IO.StreamCorruptedException: 無効なストリーム ヘッダー

Sheeraz Gul 2023年10月12日
Java.IO.StreamCorruptedException: 無効なストリーム ヘッダー

このチュートリアルでは、Java の java.io.StreamCorruptedException: 無効なストリーム ヘッダー 例外を修正する方法を示します。

Java のjava.io.StreamCorruptedException: 無効なストリーム ヘッダー

java.io.StreamCorruptedException: 無効なストリーム ヘッダー は比較的一般的な例外です。 この例外の理由を理解するには、問題の背後にある理由を説明できるため、例外の無効なストリーム ヘッダーを確認する必要があります。

StreamCorruptedException には 2つのコンストラクターがあります。1つ目は引数が 1つあり、もう 1つには引数がありません。 引数を受け入れる人は、例外の理由を説明します。

java.io.StreamCorruptedException: 無効なストリーム ヘッダー: XXXXXX は、引数 XXXXXX が無効なヘッダーの詳細を表す例外です。

この例外は通常、ObjectInputStream を使用しているときに発生します。 Javadoc によると、java.io.Serializable または java.io.Externalizable をサポートするストリームからは、これらのオブジェクトのみを読み取ることができるためです。

したがって、ObjectInputStream を使用するときはいつでも、シリアル化されたデータとともに使用する必要があります。 StreamCorruptedException: 無効なストリーム ヘッダー のほとんどは、テキスト、HTML、XML、JSON などのファイルがシリアル化可能なファイルではなく、ObjectInputStream コンストラクターに直接渡された場合に発生します。

ここでは、よく発生する java.io.StreamCorruptedException: 無効なストリーム ヘッダー と対応する ASCII 値を示します。

無効なストリーム ヘッダーの 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 sq ~
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