在我上大学的这个Java项目中,我遇到一种情况,当前正在使用
streamOut = ObjectOutputStream streamIn = ObjectInputStream streamOut.writeUTF(msgs.peek());
其中msgs是一个链接的阻止队列,通过
String in = streamIn.readUTF();
但是,我想使用一个ObjectInputStream和一个ObjectOutputStream。我已经在构造函数中初始化了它们,并在构造它后刷新了ObjectOutputStream,我读到某个地方必须这样做。
我想同时发送Strings和另一个Object类型,通过网络将其称为gameWorld(此时不关心效率)。但是当我这样做时
streamOut.writeObject("mad cuz i'm bad"); Object in = streamIn.readObject(); if(in instanceof String) String inS = (String) in;
当我发送字符串时,它什么也没捡到。。。我的朋友正在同一个项目上,他只传递一种对象,该对象的子类之一实际上是字符串,并且他的版本运行良好,但是他在线程的运行循环的每次迭代中都创建了一个新的流。
我是否需要对流执行某些操作以接收除Object之外没有其他共同祖先的不同对象,我是否需要在运行循环的每次迭代中创建一个新的流,或者是否还有其他完全属于我的东西缺少信息,我提供的信息不足以告诉您出什么问题了吗?
将String作为原始数据或对象写入流之间存在显着差异。首先,将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 吨 ŤHird的
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)