HOWTO · Java
Java.IO.StreamCorruptedException: 無効なストリーム ヘッダー
このチュートリアルでは、Java で 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() を使用して、この問題を解決できます。