java中利用HttpURLConnection进行下载,如何才可以获得较快的下载速度?

zhangle1 2011-07-05 02:03:41
下载部分采用HttpURLConnection类,代码如下:
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("Accept-Language", "zh-CN");
urlConnection.setRequestProperty("Referer", url.toString());
urlConnection.setRequestProperty("Charset", "UTF-8");
urlConnection.setRequestProperty("Range", "bytes=" + begin + "-" + end);
urlConnection.setRequestProperty("Connection", "Keep-Alive");
urlConnection.connect();
InputStream is = urlConnection.getInputStream();
//创建缓冲区,缓冲区大小为500K
int bufferSize= 500*1024;
byte[] buffer = new byte[bufferSize];

int perRead = 0;
this.raf.seek(begin);
while ((perRead = is.read(buffer)) != -1) {
print("read data size: "+perRead);
raf.write(buffer, 0, perRead);
this.part.setCurrentLength(this.part.getCurrentLength()+ perRead);
}
由于下载的文件都很大,我想采用加大缓冲区的方式来实现快速下载,因此给缓冲区设置了500K的大小,希望每次能从服务器多获取数据,也减少写入本地文件的次数。可是实际运行程序看打印结果发现,perRead = is.read(buffer) 一般一次读取8192字节, 但是偶尔也能读取更多的字节。 照此情况,每次从服务器读取的数据远比缓冲区设置的500K要小,这是怎么回事呢? 是不是下载的服务器有相关的限制需要重新配置一下(使用Apache作为web服务器)?

以下是执行程序打出的数据:

从图片可知,一般情况一次获取8K,有时也能获取到更多的数据。请大家指点一下,如何才能通过inputStream尽可能多的从服务器获取文件数据?
...全文
783 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2011-07-05
  • 打赏
  • 举报
回复
哦 一個讀 一個寫,但估計原理類似,都應該屬於系統的默認設置
dracularking 2011-07-05
  • 打赏
  • 举报
回复
是不是這個?

SO_SNDBUF
public int getSendBufferSize() throws SocketException
public void setSendBufferSize(int size) throws SocketException
在默认情况下,输出流的发送缓冲区是8096个字节(8K)。这个值是Java所建议的输出缓冲区的大小。如果这个默认值不能满足要求,可以用 setSendBufferSize方法来重新设置缓冲区的大小。但最好不要将输出缓冲区设得太小,否则会导致传输数据过于频繁,从而降低网络传输的效率。
如果底层的Socket实现不支持SO_SENDBUF选项,这两个方法将会抛出SocketException例外。必须将size设为正整数,否则setSendBufferedSize方法将抛出IllegalArgumentException例外。
uastation 2011-07-05
  • 打赏
  • 举报
回复
采用多线程下载方式,而且提高下物理的网速也是一种方法
Fly_m 2011-07-05
  • 打赏
  • 举报
回复
这样不行的,快速的下载,都是使用多线程下载,才行。你单线程下载,某些情况下,已经是极限了。

而且,你这样调试不是办法,你应该计算一下,单位时间内,下载了多少。比如kb/s,这是下载速度的通用测试,而不是管一次读取了多少。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧