我的问题是当它第二次尝试读取对象时,会抛出异常:
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at Client.run(BaseStaInstance.java:313)
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at Client.run(BaseStaInstance.java:313)
我第一次发送完全相同的对象消息;但是,当我第二次尝试做同样的事情时,它会抛出上面的错误。我是否需要重新初始化readObject()方法?我甚至打印出下面一行正在接收的消息对象,它与第一个正常工作的实例相同。
Object buf = myInput.readObject();
我假设附加有一些问题,但我真的没有用于追加。我只想每次都阅读一条新线。 我非常感谢帮助修复这个bug。谢谢。
==================================
在那一行之前,我只是在run()方法中为套接字创建输入和输出对象。对象声明在类中的run()方法之外: -
@Override
public void run() {
try {
sleep((int) 1 * 8000);
} catch (Exception e) {
e.printStackTrace();
}
try {
//Creating input and output streams to transfer messages to the server
myOutput = new ObjectOutputStream(skt.getOutputStream());
myInput = new ObjectInputStream(skt.getInputStream());
while (true) {
buf = myInput.readObject();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
你是对的;我没有关闭对象。我不知道该怎么做。
答案 0 :(得分:67)
潜在的问题是,您使用新的ObjectOutputStream
写入已使用先前ObjectInputStream
写入的现有ObjectOutputStream
。这些流具有由相应构造函数编写和读取的标头,因此如果您创建另一个ObjectOutputStream
,您将编写一个新标头,从头开始 - 猜猜是什么? - 0xAC,
并且现有的ObjectInputStream
此时并不期望另一个标头,因此它是barfs。
在@trashgod引用的Java论坛主题中,我应该省略关于'两端每个对象重新'的部分:这只是浪费。在套接字的生命周期内使用单个OOS和OIS,并且不要在套接字上使用任何其他流。
如果您想忘记自己写的内容,请使用ObjectOutputStream.reset().
请勿在同一套接字上使用任何其他流或Readers
或Writers
。对象流API可以处理所有Java原始数据类型和所有Serializable
类。