小编典典

writeUTF(String s)vs writeObject(String s)

java

在我上大学的这个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之外没有其他共同祖先的不同对象,我是否需要在运行循环的每次迭代中创建一个新的流,或者是否还有其他完全属于我的东西缺少信息,我提供的信息不足以告诉您出什么问题了吗?


阅读 262

收藏
2020-11-26

共1个答案

小编典典

将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)

2020-11-26