Java writeUTF后的额外字符

Java writeUTF后的额外字符,java,android,Java,Android,我有一个Android应用程序。它将数据发送到基于Java的程序。Android代码: Socket socket = new Socket(InetAddress.getByName("10.0.3.2"), 5555); OutputStream sout = socket.getOutputStream(); DataOutputStream out = new DataOutputStream(sout); out.wri

我有一个Android应用程序。它将数据发送到基于Java的程序。Android代码:

      Socket socket = new Socket(InetAddress.getByName("10.0.3.2"), 5555);

        OutputStream sout = socket.getOutputStream();
        DataOutputStream out = new DataOutputStream(sout);


        out.writeUTF(jsonLoginData.toString()); 

//       IN jsonLoginData i put some values in another part of code
//        jsonLoginData = new JSONObject();
//        jsonLoginData.put("login",login);
//        jsonLoginData.put("password",password);

        out.flush();
        out.close();
所以在另一方面,我有基于Java的程序,它监听5555端口并获取数据:

// var "s" is a socked listening 5555 port 

InputStream is = s.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));

  String line;
  String r = "";
  StringBuilder content = new StringBuilder(); 

      // read from the urlconnection via the bufferedreader
            while ((line = bufferedReader.readLine()) != null)
           {
             r = r + line;
           }

   bufferedReader.close();

    System.out.println("\n ==>" + r);
但问题是每次我在var“r”中都有额外的字符。 控制台向我显示:

==> <{"password":"6f3fa6ad89a459af8e1819c514059b3","login":"456"} 

==> ={"password":"e516fac382793b462d6a19fa849db53a","login":"456"} 

==> B{"password":"6f3fa6ad89a459af8e1819c514059b3","login":"456111414"} 
==>={“密码”:“e516fac382793b462d6a19fa849db53a”,“登录”:“456”}
==>B{“密码”:“6f3fa6ad89a459af8e1819c514059b3”,“登录”:“456111414”}

正如您所看到的,{…}前面有一些奇怪的符号,比如“不要使用
DataOutputStream
。只需将字节写入
OutputStream

OutputStream sout = socket.getOutputStream();
byte[] bytes = jsonLoginData.toString().getBytes("UTF-8");
sout.write(bytes);
从文档网页:

首先,将两个字节写入输出流,就像 writeShort方法,提供要跟随的字节数。此值为 实际写入的字节数,而不是 字符串。在长度之后,输出字符串的每个字符, 按顺序,对字符使用修改的UTF-8编码


因此,额外的字符是通过writeUTF方法故意添加的。我不知道他们为什么添加这个。对我来说似乎没有什么用处。可能会造成更多的混乱。

您是否记录了
jsonloginda.toString()
以确保它不包含奇怪的符号?如果您正在写入
数据输出流
,那么您应该从
数据输入流
中读取。如果您要从
输入流
中读取,那么请写入
输出流
。不要混合流类型,否则可能会产生意外效果,正如你所发现的那样。@rossum-他们并不是自己决定加入一个DataOutputStream。肯定有一个神奇的教程,每个人似乎都在从中复制,我非常想知道是哪个。@bayou.io我对此表示怀疑。这是一个很常见的错误。更可能的是,人们并不真正阅读Javadoc。为什么有人想要使用DataFooStream版本?DataInputStream在任何意义上都更可取吗?