java从socket和inputStream的慢速读取
我使用java。网在我的应用程序中接收消息的socket。接收速度很慢。接收250 kB的数据持续7秒以上。我可以做些什么来加速这一过程。7秒太长了
InputStream is = null;
byte[] arr = new byte[8192];
try {
is = client.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
int bytesNumber;
StringBuffer sb = new StringBuffer();
try {
while ((bytesNumber = is.read(arr)) >= 0) {
if (bytesNumber == 8192) {
sb.append(arr);
continue;
} else {
for (int i = 0; i < bytesNumber; i++) {
sb.append(arr[i]);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
# 1 楼答案
这是因为,如果读取的长度小于缓冲区(arr)长度,则会逐个追加一个字符。而是附加整个缓冲区内容,不需要if:
# 2 楼答案
性能如此糟糕不太可能是由于您的代码造成的。在相同的系统之间使用
curl
或类似的东西可以获得什么样的性能更大的问题是,您的代码不太可能实现您想要的功能。当前,您正在将字节数组的表示形式附加到字符串,或将字节的十进制表示形式附加到该字符串。如果服务器发送“你好,世界!”,您将得到一个字符串,上面写着“7210110810811144328711111410810033”。对于较长的文件,您将看到类似于“[B@76c5a2f7“弹出,这就是字节数组的打印方式
我会这样写,假设您正在接收用UTF-8编码的文本:
# 3 楼答案
正如tinker提到的,通常最大的限制是客户端和服务器网络。但是你可以大大简化你所拥有的。另外,在我看来,您的8K缓冲区太小了。除非有严重的内存限制,否则请使用1M或更大的内存