在我正在为大学从事的这个 Java 项目中,我遇到了一种情况,我目前正在使用以下命令成功地通过网络发送字符串
streamOut = ObjectOutputStream
streamIn = ObjectInputStream
streamOut.writeUTF(msgs.peek());
其中 msgs 是一个链接的阻塞队列,用以下命令接收它
String in = streamIn.readUTF();
但是,我想使用 ObjectInputStream 和 ObjectOutputStream。我已经在构造函数中初始化了它们,并在构造它后刷新了 ObjectOutputStream,我在某处读到你必须这样做。
我想发送字符串和另一个对象类型,通过网络将其称为 gameWorld (此时不关心效率)..但是当我这样做时
streamOut.writeObject("mad cuz i'm bad");
Object in = streamIn.readObject();
if(in instanceof String) String inS = (String) in;
当我发送字符串时它不会拾取任何内容...我的朋友正在处理同一个项目,他只传递了一种类型的对象,该对象的子类之一本质上是一个字符串,他的版本工作正常,但他在线程运行循环的每次迭代中都会创建一个新流。
我是否需要对流执行某些操作来接收除对象之外没有共同祖先的不同对象,我是否需要在运行循环的每次迭代中创建一个新流,或者是否有其他完全需要我做的事情丢失并且我提供的信息不足以判断问题所在?
将字符串作为原始数据或对象写入流之间存在显着差异。 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();
转储最后两个数组,您将得到如下结果:
写对象即 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-t第一的t第二t第三
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-w第一第二第三
结论:如果是 writeObject,则需要额外的数据(此处t)要进行流式传输,而在 writeUTF 的情况下,仅要流式传输字符串数据。
了解更多:http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#writeUTF(java.lang.String)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)