2013-10-09 149 views
2

在这个Java项目我正在为大学的writeObject(String s)将,我有一个情况我目前发送通过网络串成功地利用writeUTF(String s)将VS

streamOut = ObjectOutputStream 
streamIn = ObjectInputStream 

streamOut.writeUTF(msgs.peek()); 

其中封邮件是一个链接阻塞队列,接收它

String in = streamIn.readUTF(); 

但是,我想使用ObjectInputStream和ObjectOutputStream。我已经在构造函数中初始化它们,并且在构造它之后刷新ObjectOutputStream,我在某处读取了必须执行的操作。

我想通过网络发送字符串和另一个对象类型,称之为游戏世界(不关心在这一点上的效率)。但是当我做

streamOut.writeObject("mad cuz i'm bad"); 

Object in = streamIn.readObject(); 
if(in instanceof String) String inS = (String) in; 

它不挑当我发送字符串时,任何事情都会发生...我的朋友正在处理同一个项目,并且只传递一种类型的对象,该对象的其中一个子类基本上是一个字符串,他的版本可以正常工作,但是他创建了一个新的在他的线程运行循环的每一次迭代中流。

我需要做的东西流接收不具有比其他对象共同的祖先不同的对象,做我需要做一个新流的运行循环的每个迭代或有只是别的东西完全我错过了,我提供的信息不足以说明什么是错的?

+0

你的意思是'对象中= streamIn.readObject(); '在这行之后是空的? – smajlo

回答

4

将字符串作为原始数据或作为对象写入流之间存在显着差异。由writeObject写入的String实例最初作为String写入流中。未来的writeObject()调用将对字符串的引用写入流中。

对于实施例

ByteArrayOutputStream baos1=new ByteArrayOutputStream(); 
    oos1=new ObjectOutputStream(baos1); 
    baos2=new ByteArrayOutputStream(); 
    ObjectOutputStream oos2=new ObjectOutputStream(baos2); 
    String testString="First"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    testString="Second"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    testString="Third"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    oos1.flush(); 
    oos2.flush(); 
    byte[] byteArray1=baos1.toByteArray(); 
    byte[] byteArray2=baos2.toByteArray(); 

转储最后两个数组你会得到结果,如:
的writeObject即byteArray1
二进制:-84 -19 0 5 116 0 5 70 105 114 115 116 116 0 6 83 101 99 111 110 100 116 0 5 84 104 105 114 100
ASCII:-T - 开始步骤小号的Econd Ťħ IRD

writeUTF即byteArray2
二进制:-84 -19 0 5 119 22 0 5 70 105 114 115 116 0 6 83 101 99 111 110 100 0 5 84 104 105 114 100
ASCII:-T - 瓦特开始步骤的EcondŤHird的

结论:在的writeObject的情况下额外的数据(这里)要被流而在writeUTF的情况下被流只有字符串数据。

更多:http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#writeUTF(java.lang.String)

+0

砰的一声,钉着它。谢谢,我不知道这个参考资料,那是什么让我和为什么我的朋友版本每次都创造一个新的流。 –

+0

这两个十六进制转储之间没有区别。你已经发布了相同的两次。第一个不符合给出的ASCII渲染。 – EJP

0

如果你想用readObject()来读取字符串,你必须用writeObject()来写入它。

相关问题