日期:2014-05-20  浏览次数:20974 次

java中利用HttpURLConnection进行下载,如何才可以获得较快的下载速度?
下载部分采用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尽可能多的从服务器获取文件数据?

------解决方案--------------------
采用多线程下载方式,而且提高下物理的网速也是一种方法
------解决方案--------------------
是不是這個?

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例外。
------解决方案--------------------
哦 一個讀 一個寫,但估計原理類似,都應該屬於系統的默認設置