JAVA实现多线程断点下载

来源:互联网 发布:国服lol2017有mac版 编辑:程序博客网 时间:2024/05/22 13:17
public class jions {    public static int runnling=3;     public static int threadcount=3; public static  void  main(String[]args) throws Exception{    String path="http://down9.869v.com/setup_445.exe";     URL url=new URL(path);             HttpURLConnection con= (HttpURLConnection) url.openConnection();              con.setReadTimeout(6000);              con.setRequestMethod("GET");           int code= con.getResponseCode();           if(code==200){              int length= con.getContentLength();//已经设置了请求的位置//返回的是当前位置对应文件的输入流              RandomAccessFile raf=new RandomAccessFile("421.exe", "rwd");//记录当前线程下载的数据长度              raf.close();                            //System.out.print("文件长度:"+length);               int bolak =length/threadcount;               for(int threadID=1;threadID<=threadcount;threadID++){                   int starIndex=(threadID-1)*bolak;                   int endIndex=threadID*bolak-1;                   if(threadID==threadcount){                       endIndex=length;                                                              }                   System.out.println("线程"+threadID+"下载---->"+starIndex+"----->"+endIndex);                   new MyThread(path, threadID, starIndex, endIndex).start();               }           }else{               System.out.print("读取长度失败");                                         }     } public static class MyThread extends Thread{       public MyThread(String path, int threadID, int starIndex, int endIndex) {        super();        this.path = path;        this.threadID = threadID;        this.starIndex = starIndex;        this.endIndex = endIndex;    }    private String path;         private int threadID;       private int starIndex;       private int endIndex;               public void run(){           try {        //检查是否在记录下载长度的文件 如果存在读取这个文件的数据       File tempFile =new File(threadID+".txt");        if(tempFile.exists()&&tempFile.length()>0){        FileInputStream fis=new FileInputStream(tempFile);        byte[] tpem=new byte[1024];        int leng =fis.read(tpem);        String dowmlod =new String(tpem,0,leng);        int downlodalenInt= Integer.parseInt(dowmlod);        starIndex=downlodalenInt;        fis.close();        }                    URL url=new URL(path);       HttpURLConnection con =(HttpURLConnection) url.openConnection();       con.setRequestMethod("GET");       con.setRequestProperty("Range", "byte="+starIndex+"-"+endIndex);       System.out.println("线程真实下载位置"+threadID+"下载----"+starIndex);       con.setReadTimeout(8000);              int code=con.getResponseCode();       System.out.println("code"+code);       InputStream is= con.getInputStream();       RandomAccessFile raf=new RandomAccessFile("421.exe", "rwd");       raf.seek(starIndex);       int len=0;       byte[]buffer=new byte[1024];       int total=0;       while((len=is.read(buffer))!=-1){         RandomAccessFile flie =new RandomAccessFile(threadID+".txt ","rwd");         raf.write(buffer,0,len);           total+=len;           System.out.println("线程"+threadID+"total:"+total);          flie.write((total+starIndex+"").getBytes());//记录下载的位置          flie.close();       }       is.close();       raf.close();       System.out.println("线程ID"+threadID+"下载完毕......");    } catch (Exception e) {                e.printStackTrace();    }finally{        runnling--;        if(runnling==0){            for(int i=1 ;i<=3;i++){                File file=new File(i+".txt");                file.delete();                            }            System.out.println("文件下载半壁删除所有下载记录");        }            }        }  } }


0 0
原创粉丝点击