当前位置: 首页 > 面试题库 >

writeUTF(String s)vs writeObject(String s)

赖渊
2023-03-14
问题内容

在我上大学的这个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)



 类似资料:
  • Elixir中的字符串插入双引号之间,它们以UTF-8编码。 与C和C ++不同,默认字符串是ASCII编码的,只有256个不同的字符,UTF-8由66536 code points 。 这意味着UTF-8编码由许多不同的可能字符组成。 由于字符串使用utf-8,我们也可以使用符号:ö,ł等。 创建一个字符串 要创建字符串变量,只需将字符串赋值给变量 - str = "Hello world"

  • Fortran语言可以将字符视为单个字符或连续字符串。 字符串的长度可以只有一个字符,或者甚至可以是零长度。 在Fortran中,字符常量在一对双引号或单引号之间给出。 内在数据类型character存储字符和字符串。 字符串的长度可以由len specifier 。 如果未指定长度,则为1.您可以按位置引用字符串中的单个字符; 最左边的字符位于第1位。 字符串声明 声明字符串与其他变量相同 -

  • String对象允许您使用一系列字符; 它使用许多辅助方法包装Javascript的字符串原始数据类型。 由于JavaScript自动在字符串基元和String对象之间进行转换,因此可以在字符串基元上调用String对象的任何辅助方法。 语法 (Syntax) 使用以下语法创建String对象 - var val = new String(string); String参数是一系列已正确编码的字

  • 在R中的一对单引号或双引号内写入的任何值都被视为字符串。 内部R将每个字符串存储在双引号内,即使您使用单引号创建它们也是如此。 字符串构造中应用的规则 字符串开头和结尾的引号应该是双引号或双引号。 他们不能混在一起。 双引号可以插入到以单引号开头和结尾的字符串中。 单引号可以插入到以双引号开头和结尾的字符串中。 双引号不能插入以双引号开头和结尾的字符串中。 单引号不能插入以单引号开头和结尾的字符串

  • 字符串是一系列字符,可以包含字母,数字,特殊字符或所有字符。 如果变量用双引号“”括起来,则称该变量为字符串。 语法 (Syntax) variablename = "string" 例子 (Examples) str1 = "string" ' Only Alphabets str2 = "132.45" ' Only Numbers str3 = "!@#$;*" ' Only S

  • String对象允许您使用一系列字符; 它使用许多辅助方法包装JavaScript的字符串原始数据类型。 由于JavaScript自动在字符串基元和String对象之间进行转换,因此可以在字符串基元上调用String对象的任何辅助方法。 使用以下语法创建String对象。 var val = new String(string); 字符串参数是一系列已正确编码的字符。 串。 字符串属性 以下是S

  • 在Java编程中广泛使用的字符串是一系列字符。 在Java编程语言中,字符串被视为对象。 Java平台提供String类来创建和操作字符串。 创建字符串 创建字符串的最直接方法是写 - String greeting = "Hello world!"; 每当它遇到代码中的字符串文字时,编译器就会创建一个String对象,其值在这种情况下为“Hello world!”。 与任何其他对象一样,您可以

  • 字符串是Python中最流行的类型之一。 我们可以通过在引号中包含字符来创建它们。 Python将单引号视为双引号。 创建字符串就像为变量赋值一样简单。 例如 - var1 = 'Hello World!' var2 = "Python Programming" 访问字符串中的值 Python不支持字符类型; 这些被视为长度为1的字符串,因此也被视为子字符串。 要访问子字符串,请使用方括号进行切