首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TCP通过网络传输文件(加快传输速度)

使用TCP通过网络传输文件(加快传输速度)
EN

Stack Overflow用户
提问于 2012-04-14 03:25:52
回答 3查看 4.7K关注 0票数 2

我一直在尝试通过Socket连接发送一个大文件,但运行速度很慢,我想知道是否可以以某种方式优化此代码以提高传输速度。

这是我发送文件的代码:

代码语言:javascript
复制
byte[] buffer = new byte[65536];
int number;

while ((number = fileInputStream.read(buffer)) != -1) {
    socketOutputStream.write(buffer, 0, number);
}

socketOutputStream.close();
fileInputStream.close();

这是我用来在另一台机器上接收文件的代码:

代码语言:javascript
复制
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的。有没有人能提供一些建议来加速这个代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-14 03:31:57

除了缺少用于close语句的finally块之外,该代码没有明显的错误。

多少数据需要多长时间?花费时间的不太可能是FileOutputStream --更有可能的是网络速度太慢。您可以并行地从网络读取和写入文件系统,但这将是一项大量的工作,而且不太可能带来那么多好处,IMO。

票数 5
EN

Stack Overflow用户

发布于 2012-04-14 11:16:34

您可以尝试在FileOutputStream周围使用BufferedOutputStream。无论您从网络读取的计数是多少,它都具有对所有磁盘写入进行块对齐的效果。我不认为会有什么大的不同,但这可能会有一点帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-02-11 15:42:27

我在处理大文件时也遇到了类似的问题。我意识到,使用相同的缓冲区从硬盘读取和写入网络是问题所在。文件系统IO喜欢更大的缓冲区,因为硬盘驱动器执行所有查找和读取的工作要少得多。另一方面,网络则更倾向于使用较小的缓冲区来优化吞吐量。

解决方案是使用较大的缓冲区从硬盘读取,然后将此缓冲区分成较小的块写入网络流。

在4mb读取和32kb写入的情况下,对于任何文件的整个长度,我都能够以100%的利用率最大化我的NIC。然后,您可以通过一次读取32kb并将其存储在内存中,然后一次将4mb写入硬盘驱动器,在服务器上执行镜像版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10147094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档