首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.StreamCorruptedException:无效的流头: 48656C6C

java.io.StreamCorruptedException:无效的流头: 48656C6C
EN

Stack Overflow用户
提问于 2015-02-03 19:59:36
回答 2查看 11.8K关注 0票数 2

我正在使用netty客户端服务器进行通信。消息以字节数组的形式成功接收。当我将字节数组转换为ObjectInputStream时,我得到了异常

代码语言:javascript
复制
java.io.StreamCorruptedException: invalid stream header: 48656C6C
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at nettyClientServer2.PongHandler.messageReceived(PongHandler.java:99)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)
at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)
at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

我就是这样转变的..。

代码语言:javascript
复制
byte[] ppBytes=pptmp.status;
ObjectInputStream input = null;
input = new ObjectInputStream(new ByteArrayInputStream(ppBytes));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-03 20:18:04

ppBytes必须保存序列化对象的字节。请看下面的简短示例。

代码语言:javascript
复制
byte[] buffer;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos)) {
    oos.writeObject("Hello World");
    buffer = bos.toByteArray();
    for (int i : buffer) {
        System.out.printf("%02X ", i & 0xFF);
    }
    System.out.println("");
}

try (ByteArrayInputStream bis = new ByteArrayInputStream(buffer);
        ObjectInputStream ois = new ObjectInputStream(bis)) {
    String input = (String) ois.readObject();
    System.out.println("input: " + input);
}

输出

代码语言:javascript
复制
//                   H  e  l  l  o     W  o  r  l  d
AC ED 00 05 74 00 0B 48 65 6C 6C 6F 20 57 6F 72 6C 64 
input: Hello World

在下面的示例中,缓冲区包含字符串Hello World的字节表示形式。使用ObjectInputStream读取这些字节将失败,并返回java.io.StreamCorruptedException: invalid stream header: 48656C6C。作为序列化的String对象。

代码语言:javascript
复制
byte[] buffer;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
    bos.write("Hello World".getBytes(StandardCharsets.ISO_8859_1));
    buffer = bos.toByteArray();
    for (int i : buffer) {
        System.out.printf("%02X ", i & 0xFF);
    }
    System.out.println("");
}

try (ByteArrayInputStream bis = new ByteArrayInputStream(buffer);
        ObjectInputStream ois = new ObjectInputStream(bis)) {
    String input = (String) ois.readObject();
    System.out.println("input: " + input);
}

输出

代码语言:javascript
复制
// H  e  l  l  o     W  o  r  l  d
   48 65 6C 6C 6F 20 57 6F 72 6C 64 
   Exception in thread "main" java.io.StreamCorruptedException: invalid \
      stream header: 48656C6C
票数 5
EN

Stack Overflow用户

发布于 2015-02-03 23:47:54

您可以通过将字符串转换为byte[]然后再将其转换为String来完成此操作:

代码语言:javascript
复制
String hello = "Hello world";
byte[] bytes = hello.getBytes( "iso-8859-1" );  // or utf-8
// send
String world = new String( bytes, "iso-8859-1" ); // or utf-8
System.out.println( hello );
System.out.println( world );

读取和写入(字符串)对象更可靠,这绕过了编码/解码的赌博:

代码语言:javascript
复制
String hello = "Hello world";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeUTF( hello );
oos.flush();
byte[] bytes = baos.toByteArray();
// send
ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
ObjectInputStream ois = new ObjectInputStream( bais );
String world = ois.readUTF();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28298366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档