下载部分采用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尽可能多的从服务器获取文件数据?

解决方案 »

  1.   

    这样不行的,快速的下载,都是使用多线程下载,才行。你单线程下载,某些情况下,已经是极限了。而且,你这样调试不是办法,你应该计算一下,单位时间内,下载了多少。比如kb/s,这是下载速度的通用测试,而不是管一次读取了多少。
      

  2.   

    是不是這個?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例外。