我的问题是,当它尝试第二次读取对象时,会引发异常:
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(); } } }
你是对的; 我没有关闭物体。我不确定该怎么做。
潜在的问题是,您正在使用newObjectOutputStream来写入已使用过before的流ObjectOutputStream。这些流具有由各自的构造函数编写和读取的标头,因此,如果创建另一个ObjectOutputStream标头,则将编写一个新的标头,以-猜猜是什么?-0xAC,并且现有的ObjectInputStream对象此时不希望有其他标头,因此会阻塞。
newObjectOutputStream
ObjectOutputStream
ObjectInputStream
在@trashgod引用的Java Forums线程中,我应该省略有关“两端的每个对象都重新创建”的部分:这只是浪费。在套接字的整个生命周期内使用一个OOS和OIS,并且不要在套接字上使用任何其他流。
如果您想忘记自己写的东西,请使用 ObjectOutputStream.reset().
ObjectOutputStream.reset().
并且不要使用任何其他流Readers或Writers在同一套接字上。对象流API可以处理所有Java基本数据类型和所有Serializable类。
Writers