Java writeUTF后的额外字符
我有一个Android应用程序。它将数据发送到基于Java的程序。Android代码: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
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在任何意义上都更可取吗?