迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 中对一个 Switch Case 语句使用多个值

发布时间:2023/07/16 浏览次数:172 分类:Java

在本文中,我们将学习如何在一个 switch-case 语句中使用多个值。使用 switch-case 语句 Java 允许程序员通过使用 switch case 语句来像其他编程语言一样克服太多的 if-else 条件语句。

Java 中的线程安全延迟初始化

发布时间:2023/07/16 浏览次数:59 分类:Java

本文将讨论在 Java 中实现线程安全的延迟初始化。Java 中的对象初始化 延迟初始化是延迟对象创建的行为。 它还可能导致某些计算任务或首次昂贵流程的延迟。

在 Java 中显示动画 GIF

发布时间:2023/07/16 浏览次数:112 分类:Java

我们可以使用javax包的Swing库方法来在Java中显示动画GIF。 本文介绍用户如何在 Java 应用程序或单独的窗口中显示动画 GIF。使用 Javax.swing 库在 Java 中显示动画 GIF

在 Java 中用 %20 替换空格

发布时间:2023/07/16 浏览次数:96 分类:Java

在本文中,我们将学习两种用 %20 替换给定字符串的所有空格的方法。Java中使用replaceAll()方法将空格替换为%20 在这里,我们使用Java内置方法 replaceAll() 将所有空格替换为%20字符串。

Java 中的矩阵乘法

发布时间:2023/07/16 浏览次数:99 分类:Java

在本文中,我们将学习在 Java 中将两个矩阵相乘。Java 中两个矩阵相乘 我们使用乘法和加法运算符来乘两个矩阵。

Java Synchronised变量

发布时间:2023/07/16 浏览次数:131 分类:Java

本文将讨论如何在Java中同步或锁定变量。同步或锁定是避免此类错误情况的解决方案。 synchronized 关键字

Java最快的排序算法

发布时间:2023/07/16 浏览次数:155 分类:Java

本文将介绍两种最快的排序算法并用 Java 编写它们的代码。第一种技术是计数排序,它有一些局限性。 因此,我们还将介绍合并排序算法。 Java中的计数排序算法 Java中的归并排序算法

在 Java 中将毫秒转换为分钟和秒

发布时间:2023/07/16 浏览次数:140 分类:Java

本文介绍了Java中将毫秒转换为分钟和秒的三种不同方法,我们将通过示例代码一一了解。使用 java.util.concurrent 包将毫秒转换为分钟和秒 java.util 库的并发包包含 TimeUnit 类来管理 Java 中的时间。

重新启动 Java 程序

发布时间:2023/07/16 浏览次数:118 分类:Java

在菜单驱动的程序或游戏中,我们需要一个选项来重新启动或重置我们的程序。 我们可以通过递归调用函数或使用条件循环语句来重新启动Java中的程序。使用 do-while 条件语句

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便