我正在使用套接字从服务器下载一个 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/