java实现多线程下载(二)
设置文件的大小
access.setLength(size);
// 关闭此随机访问文件流并释放与该流关联的所有系统资源。
access.close();
// 指示近期服务器不太可能有其他请求。
httpURLConnection.disconnect();
// 定义线程的数量
int threadNumber = 3;
// 向创建出来的与目标文件大小及类型相同的文件中写入数据
for (int i = 1; i <= threadNumber; i++) {
// 根据目标资源的总大小计算每条线程所需要分担的下载大小
int blockSize = size / threadNumber;
// 计算出每条线程的开始下载位置
final int startSize = (i - 1) * blockSize;
int temp = i * blockSize - 1;
// 判断当前运行的线程是不是最后一条
if (i == threadNumber) {
if (temp < size) {
temp = size;
}
}
// 计算线程下载的结束位置
final int endSize = temp;
// 创建线程内部的文件随机读取的对象
final RandomAccessFile threadFile = new RandomAccessFile(file,
"rw");
// 创建线程
new Thread() {
public void run() {
// 创建与资源文件的在一次连接
try {
// 根据目标资源的路径创建url对象
URL url = new URL(path);
// 打开链接
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// 设置一般请求属性。
httpURLConnection.setRequestProperty("Range",
"bytes=" + startSize + "-" + endSize);
// 获取连接后的输入流对象
InputStream is = httpURLConnection
.getInputStream();
// 设置文件开始写入的位置
threadFile.seek(startSize);
//缓冲区创建
byte buffer[]=new byte[1024];
//读取文件长度
int len=0;
while((len=is.read(buffer))!=-1){
threadFile.write(buffer, 0, len);
}
//释放资源
is.close();
threadFile.close();
httpURLConnection.disconnect();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}