我试图首先读取指定消息大小的4个字节(int),然后根据字节数读取剩余的字节数。我使用以下代码来完成此任务:
DataInputStream dis = new DataInputStream(
mClientSocket.getInputStream());
// read the message length
int len = dis.readInt();
Log.i(TAG, "Reading bytes of length:" + len);
// read the message data
byte[] data = new byte[len];
if (len > 0) {
dis.readFully(data);
} else {
return "";
}
return new String(data);
有更好/更有效的方法吗?
答案 0 :(得分:2)
来自readUTF的JavaDocs:
首先,读取两个字节并用于构造无符号 16位 * 整数 *,与readUnsignedShort方法完全相同。这个 整数值称为UTF长度并指定数量 要读取的其他字节。然后将这些字节转换为 通过分组考虑它们的字符。每组的长度是 根据组的第一个字节的值计算。字节 跟随一个组,如果有的话,是下一组的第一个字节。
唯一的问题是您的协议似乎只为有效负载长度发送4个字节。也许你可以做一个类似的方法,但将readinel读取的长度增加到4个字节/ 32位。
另外,我看到你只是在做新的String(字节),只要数据的编码与“平台的默认字符集”相同,它就能正常工作。请参阅javadoc因此,确保正确编码它会更安全(例如,如果您知道发送方将其作为UTF-8发送,则执行新的字符串(字节,“UTF-8”))
答案 1 :(得分:0)
怎么样
DataInputStream dis = new DataInputStream(new BufferedInputStream(
mClientSocket.getInputStream()));
return dis.readUTF();
答案 2 :(得分:-1)
您可以像这样使用read(byte[] b, int off, int len)
byte[] data = new byte[len];
dis.read(data,0,len);