我一直在尝试通过Socket连接发送一个大文件,但运行速度很慢,我想知道是否可以以某种方式优化此代码以提高传输速度。
这是我发送文件的代码:
byte[] buffer = new byte[65536];
int number;
while ((number = fileInputStream.read(buffer)) != -1) {
socketOutputStream.write(buffer, 0, number);
}
socketOutputStream.close();
fileInputStream.close();这是我用来在另一台机器上接收文件的代码:
byte[] buffer = new byte[65536];
InputStream socketStream= clientSocket.getInputStream();
File f=new File("C:\\output.dat");
OutputStream fileStream=new FileOutputStream(f);
while ((number = socketStream.read(buffer)) != -1) {
fileStream.write(buffer,0,number);
}
fileStream.close();
socketStream.close();我想大部分时间都是写给fileStream的。有没有人能提供一些建议来加速这个代码。
发布于 2012-04-14 03:31:57
除了缺少用于close语句的finally块之外,该代码没有明显的错误。
多少数据需要多长时间?花费时间的不太可能是FileOutputStream --更有可能的是网络速度太慢。您可以并行地从网络读取和写入文件系统,但这将是一项大量的工作,而且不太可能带来那么多好处,IMO。
发布于 2012-04-14 11:16:34
您可以尝试在FileOutputStream周围使用BufferedOutputStream。无论您从网络读取的计数是多少,它都具有对所有磁盘写入进行块对齐的效果。我不认为会有什么大的不同,但这可能会有一点帮助。
发布于 2013-02-11 15:42:27
我在处理大文件时也遇到了类似的问题。我意识到,使用相同的缓冲区从硬盘读取和写入网络是问题所在。文件系统IO喜欢更大的缓冲区,因为硬盘驱动器执行所有查找和读取的工作要少得多。另一方面,网络则更倾向于使用较小的缓冲区来优化吞吐量。
解决方案是使用较大的缓冲区从硬盘读取,然后将此缓冲区分成较小的块写入网络流。
在4mb读取和32kb写入的情况下,对于任何文件的整个长度,我都能够以100%的利用率最大化我的NIC。然后,您可以通过一次读取32kb并将其存储在内存中,然后一次将4mb写入硬盘驱动器,在服务器上执行镜像版本。
https://stackoverflow.com/questions/10147094
复制相似问题