java - 将文件从服务器传输到客户端会导致下载速度非常低

标签 java performance networking download

我正在使用套接字从服务器下载一个 45 MB 的文件。虽然测量系统流量显示下载速度约为 4 MB/s,但在 Java 中,我仅测量到 60 KB/s。

客户端:

int fileSize = Network.in.readInt(); //DataInputStream
byte[] data = new byte[fileSize];
for(int i = 0;i < data.length;i++)
{
    if(i % 1024 == 0)Log.info("Downloading: " + (i / 1024) + " KB / " + (fileSize / 1024) + " KB");
    data[i] = Network.in.readByte();
}
//int bytesRead = Network.in.read(data,0,data.length);
//int current = bytesRead;
//
//do {if(current % 16384 == 0)Log.info("Downloading: " + (current / 1024) + " KB / " + (fileSize / 1024) + " KB");
//     bytesRead = Network.in.read(data, current, (data.length-current));
//     if(bytesRead >= 0) current += bytesRead;
//} while(bytesRead > -1);

服务器端:

out.writeInt(data.length);   //DataOutputStream
//for(int i = 0;i < data.length;i++)
//{
//  out.writeByte(data[i]);
//}
out.write(data, 0, data.length);

使用注释掉的替代方案没有任何区别。

最佳答案

您正在编写一个byte[]并将其读入一个byte[],但一次只读取一个字节,这意味着为每个字节调用一次操作系统文件。我建议一次读取一个byte[]。例如使用readFully

int fileSize = Network.in.readInt(); //DataInputStream
byte[] data = new byte[fileSize];
Network.in.readFully(data);

如果您需要逐步查看它,您可以这样做

for (int start = 0; start < fileSize; start += 8192) {
    Log.info("Downloading: " + (start / 1024) + " KB / " + (fileSize / 1024) + " KB");
    Network.in.readFully(data, start, Math.min(fileSize - start, 8192));
}

关于java - 将文件从服务器传输到客户端会导致下载速度非常低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453382/

相关文章:

java - 谷歌网址缩短不起作用

iphone - 为什么这个 CATiledLayer/PDF 代码很慢?

c++ - 多个提升 io_service 用于单独线程上的多个网卡

java - 如何在 java 中的未映射网络打印机上打印 PDF?

performance - jquery lazyload images 和 webp with fallback

C# 将通过远程桌面(或其他)在本地运行的 WinForm 应用程序连接到数据库

java - 从 android Activity 中提取并将其放入数据包类中的方法?会出什么问题?

java - 避免对大型日志消息进行字符串连接

java - Android布局中string.xml中的字符串格式

python - 检查字典中的成员资格与 python 中的集合