Java StreamCorruptedException:无效类型代码:AC
我的问题是,当它第二次尝试读取对象时,会抛出异常:Java StreamCorruptedException:无效类型代码:AC,java,multithreading,streaming,object,Java,Multithreading,Streaming,Object,我的问题是,当它第二次尝试读取对象时,会抛出异常: 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(Base
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()。
不要在同一套接字上使用任何其他流或
读卡器
或写卡器
。对象流API可以处理所有Java基本数据类型和所有可序列化的类。根本的问题是,您正在使用一个新的ObjectOutputStream
来写入一个已经使用以前的ObjectOutputStream
来写入的流。这些流具有由各自的构造函数写入和读取的头,因此,如果您创建另一个ObjectOutputStream
,您将编写一个新头,该头以-猜怎么着?-0xAC、
和现有的ObjectInputStream
此时不需要另一个头,因此它会呕吐
在@trashgod引用的Java论坛线程中,我应该省略关于“两端的每个对象都是新的”的部分:这只是浪费。在套接字的生命周期中使用单个OOS和OIS,并且不要在套接字上使用任何其他流
如果想忘记所写的内容,请使用ObjectOutputStream.reset()。
不要在同一套接字上使用任何其他流或
读卡器
或写卡器
。对象流API可以处理所有Java基元数据类型和所有可序列化的类。我不确定在哪里关闭objectNB您应该捕获EOFEException,不要将其视为错误:不要记录或打印堆栈跟踪;让它终止读取循环。我不知道为什么您会在您所在的位置捕获未知后异常:它不能从相应的try块中抛出。睡眠简直是浪费时间。删除它。我不确定在哪里关闭objectNB您应该捕获EOFEException,不要将其视为错误:不要记录或打印堆栈跟踪;让它终止读取循环。我不知道为什么您会在您所在的位置捕获未知后异常:它不能从相应的try块中抛出。睡眠简直是浪费时间。删除它。+1@rookie:这是正确的答案,来自原始来源!:-)@AkhilKNambiar我不知道你问我的问题上面没有回答。@AndroidOptimist什么代码?我没有发布任何代码。这个答案的本质是删除代码。+1@rookie:这是正确的答案,来自原始源代码!:-)@AkhilKNambiar我不知道你问我的问题上面没有回答。@AndroidOptimist什么代码?我没有发布任何代码。这个答案的本质是删除代码。