我的问题是当它第二次尝试读取对象时,它会抛出异常:
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();
我假设附加有一些问题,但我真的没有用附加。我只想每次都读新的一行。 我真的很感激能帮助修复这个错误。谢谢。
======================================
在那一行之前,我只是在 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();
}
}
}
你是对的;我不关闭该对象。我不知道该怎么做。
根本问题是您正在使用新的
ObjectOutputStream
写入您已经使用过之前的 ObjectOutputStream
写入的流。这些流具有由各自的构造函数写入和读取的标头,因此,如果您创建另一个 ObjectOutputStream
,您将编写一个新的标头,该标头以 - 猜猜怎么着? - 0xAC,
和现有的 ObjectInputStream
此时不期望另一个标头,因此它会呕吐。
在 @trashgod 引用的 Java 论坛帖子中,我应该省略关于“两端的每个对象重新创建”的部分:这只是浪费。在套接字的生命周期中使用单个 OOS 和 OIS,并且不要在套接字上使用任何其他流。
如果您想忘记自己写过的内容,请使用
ObjectOutputStream.reset().
并且不要在同一套接字上使用任何其他流或
Readers
或 Writers
。对象流 API 可以处理所有 Java 原始数据类型和所有 Serializable
类。
对于文件,这是由于向文件追加新的
ObjectOutputStream
导致的。简单的答案是“不”。通常有一些方法可以重写整个文件,这是首选方法。还有另一种解决方案涉及扩展 ObjectOutputStream
并覆盖 writeStreamHeader()
不执行任何操作,但这不是首选,至少对我来说是这样。