java学习_小程序(四线程断点网络资源下载,即时进度反馈)

来源:互联网 发布:逆战天梯卡数据不扣分 编辑:程序博客网 时间:2024/05/23 01:58
/**
* 完成一个多线程断点下载工具
* 1.通过提供的网络文件地址,下载该文件
* 2.使用多个线程同时下载,并且实时更新下载进度(0%~100%)
* 3.能够实现断点功能
package com.netDemo;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class MyThreadCopy extends Thread  {/** * 完成一个多线程断点下载工具 * 1.通过提供的网络文件地址,下载该文件 * 2.使用多个线程同时下载,并且实时更新下载进度(0%~100%) * 3.能够实现断点功能 */private String sorce ;private File target ;private long start ;private long end ;public MyThreadCopy(String sorce,File target, long start, long end) {this.sorce = sorce ;this.target = target;this.start = start;this.end = end;}@Overridepublic void run() {InputStream input = null ; RandomAccessFile output = null;long count = 0;try {URL url =  new URL(sorce);HttpURLConnection conn =  (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setReadTimeout(100); input =  conn.getInputStream();output = new RandomAccessFile(target, "rw");long total = conn.getContentLength();File targetp = new File(target.getParent(),"copy");ProgressReturn pr = new ProgressReturn (total,Long.valueOf(getName().substring(7)),targetp,target);pr.start();input.skip(start+pr.getCurrent());output.seek(start+pr.getCurrent());byte[] b = new byte[1024];int len = 0;while ((len = input.read(b)) != -1 && count <= (end - start)) {sleep(1000);output.write(b, 0, len); count += len;pr.setCurrent(count);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (output != null)output.close();if (input != null)input.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) throws IOException {String sorce = "http://img.taopic.com/uploads/allimg/131117/234805-13111FZ25393.jpg";  URL url =  new URL(sorce);HttpURLConnection conn =  (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setReadTimeout(10000);int code =conn.getResponseCode();if(code == HttpURLConnection.HTTP_OK){ long length = conn.getContentLength(); long needToCopy = length/4 ; File target = new File ("C:\\Users\\ddf\\Desktop\\test",sorce.substring(sorce.lastIndexOf("/")));//新生成的目标文件 路径 for(int i = 0 ;i < 4 ;i++){ new MyThreadCopy(sorce,target,i*needToCopy,(i+1)*needToCopy).start(); }}}}

package com.netDemo;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;public class ProgressReturn extends Thread  {private long total ;//源文件要拷贝的总字节数目private long current ;//记录当前所有线程共写了多少字节private long index ;//当前是哪个线程 由 thread.getId()传值;private File targetP ;//记录文件private long ctotal ;//当前四个进程一共写了多少private File target ;   //要写入的目标文件public ProgressReturn(long total, long index, File targetP,File target) {super();this.total = total;this.index = index;this.targetP = targetP;this.target = target;}public  long getCurrent(){return current; // 向外提供每个线程当前拷贝字节数 ,用于断点拷贝}public void setCurrent(long current){this.current = current;}@Overridepublic void run() {while(ctotal != total){try {RandomAccessFile raf = new RandomAccessFile(targetP,"rw");raf.seek(index*8);raf.writeLong(current);ctotal = target.length(); System.out.println("当前总进程拷贝了:"+ctotal*1.0/total*100+"%");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}System.out.println("拷贝100%,完成");if(ctotal == total) {if(targetP.exists()){targetP.delete();}System.out.println("已删除记录文件");}}}


*/
原创粉丝点击