java实现多线程下载(二)

2014-11-24 08:49:19 · 作者: · 浏览: 1
设置文件的大小 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(); } } } }