迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 异常 Java.IO.StreamCorruptedException: Invalid Stream Header

作者:迹忆客 最近更新:2023/07/16 浏览次数:

本文介绍如何修复Java的 java.io.StreamCorruptedException: invalid stream header 异常。


Java 中的 java.io.StreamCorruptedException: invalid stream header

java.io.StreamCorruptedException: invalid stream header 是相对常见的异常。 要了解此异常的原因,我们需要查看异常中的无效流标头,因为它可以解释问题背后的原因。

StreamCorruptedException 有两个构造函数,第一个有一个参数,另一个没有参数。 接受论点的人描述了异常的原因。

java.io.StreamCorruptedException: invalid stream header: XXXXXX 是带有参数的异常,其中 XXXXXX 表示无效的标头详细信息。

当我们使用 ObjectInputStream 时,通常会发生此异常。 因为,根据 Javadoc,只能从支持 java.io.Serialized 或 java.io.Externalizable 的流中读取那些对象。

因此,每当我们使用ObjectInputStream时,都应该将其与序列化数据一起使用。 当文本、HTML、XML、JSON 等文件直接传递给 ObjectInputStream 构造函数而不是可序列化文件时,大多数 StreamCorruptedException: invalid Stream header 都会发生。

以下是一些常见的 java.io.StreamCorruptedException: 具有相应 ASCII 值的无效流标头。

无效流标头的十六进制值 十六进制的整数 十六进制的 ASCII 值
54657374 084 101 115 116 Test
48656C6C 072 101 108 108 Hell
54656D70 084 101 109 112 Temp
4920616D 073 032 097 109 I am
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: invalid stream header 异常的示例。 参见示例:

package jiyik;

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: invalid stream header 异常。

查看输出:

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 自动将文本转换为对象; 十六进制值 54657374 被转换为 Test 作为文本,我们必须将其直接作为字节发送。

我们可以使用readObject()writeObject()方法来解决这个问题。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便