JAVA实现多线程断点下载

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("文件下载半壁删除所有下载记录");
        }

    }

  }
  }

}

时间: 2024-12-12 19:00:18

JAVA实现多线程断点下载的相关文章

Android/java http多线程断点下载(附源码)

先看下项目结构: http多线程断点下载涉及到 数据库,多线程和http请求等几个模块,东西不是很多,想弄清楚也不是很困难,接下来我和大家分享下我的做法. 一.先看MainActivity.java 成员变量,主要是一些下载过程的变量和handler private String path = "http://192.168.1.3:8080/wanmei/yama.apk"; private String sdcardPath; private int threadNum = 5;

Java之多线程断点下载的实现

RandomAccessFile类: 此类的实例支持对随机訪问文件的读取和写入.随机訪问文件的行为相似存储在文件系统中的一个大型 byte 数组. 存在指向该隐含数组.光标或索引,称为文件指针.输入操作从文件指针開始读取字节.并随着对字节的读取而前移此文件指针. 假设随机訪问文件以读取/写入模式创建,则输出操作也可用.输出操作从文件指针開始写入字节.并随着对字节的写入而前移此文件指针.写入隐含数组的当前末尾之后的输出操作导致该数组扩展.该文件指针能够通过 getFilePointer 方法读取.

Java实现多线程断点下载(下载过程中可以暂停)

线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.不难理解,如果你线程多的话,那下载的越快. 现流行的下载软件都支持多线程,且支持中途暂停下载,再次开始时不会从头开始下载. 两种功能的实现步骤如下: (1)连接到下载资源文件时,首先判断资源文件大小,同步的在本地创建一个大小相同的临时文件用于存储下载数据. (2)根据线程数量确定每个线程所需下载的文

多线程断点下载原理(java代码实例演示)

其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载,首先:你必须明白第一点,那么就是,什么是多线程下载,该知识点可以查看本博客上一篇文章,Android之多线程下载原理,断点下载呢,其实就是在这个的基础之上添加了一些东西,那么添加了什么东西了,现在来做一个详细的了解. 1.在下载的过程中,边下载,变用一个文件来记录下载的位置,也就是下载了多少的数据 1.创建文件 2.记录下载多少数据 3.存储数据 2.第二次下载的时候,就去读取文件中是否存有数据,读取上次下载的位置

Java多线程断点下载

多线程下载已经提高了下载的效率,但是当一些特殊情况发生的时候,我们需要对程序进行处理,这样效率会更高.比如,断电断网等造成下载中断,那么我们下一次又要重新开始下载,这样效率底下,所以我们可以考虑使用断点下载.其原理主要是把每次每个线程的下载状况(已经下载的位置)保存到文件,下次读取出来,从上一次下载的位置继续下载,这样就大大提高了下载的效率. 效果: 开始下载: 下载过程中: 下载过程中,系统临时文件保存已下载的位置: 下载完毕,系统清楚记录下载位置的临时文件: 附代码如下: 1 import

JAVA下实现多线程断点下载

多线程断点下载:顾名思义是用多线程实现的,断点是当第三方因素(断电.断网等)中断下载时,下次下载可以继续上次下载的地方下载. 1.通过getContentLength可以获取要下载文件的大小,这样可以在本机上创建一个相同大小的文件用来下载. int fileLength = connection.getContentLength(); 2.由于是多线程,所以要给每一个线程均分分配要下载的位置. for(int i = 0; i < threadCount; i ++) { int startTh

java多线程断点下载原理(代码实例演示)

原文:http://www.open-open.com/lib/view/open1423214229232.html 其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载,首先:你必须明白第一点,那么就是,什么是多线程下载,该知识点可以查看本博客上一篇文章,Android之多线程下载原理,断点下载呢,其实就是在这个的基础之上添加了一些东西,那么添加了什么东西了,现在来做一个详细的了解. 1.在下载的过程中,边下载,变用一个文件来记录下载的位置,也就是下载了多少的数据

后台多任务多线程断点下载

忘了上图: 多线程断点下载其实不是很难,主要就是三个方面: 1.根据文件的大小和下载线程的数量,确定每个下载线程要下载的分割文件的大小: 2.记录每个下载线程已经下载完成的进度: 3.将每个线程下载的分割的文件合并到一个文件中. 那么怎么将远程的一个文件分割成三部分来下载呢?其实在HTTP协议中,有一个Range字段,用于客户端到服务器端的请求,可通过该字段指定下载文件的某一段大小,及其单位,格式为:Range: bytes x - y,eg:Range: bytes=0-100 下载从第0 -

Android实现多线程断点下载

本案例在于实现文件的多线程断点下载,即文件在下载一部分中断后,可继续接着已有进度下载,并通过进度条显示进度.也就是说在文件开始下载的同时,自动创建每个线程的下载进度的本地文件,下载中断后,重新进入应用点击下载,程序检查有没有本地文件的存在,若存在,获取本地文件中的下载进度,继续进行下载,当下载完成后,自动删除本地文件. 1. 定义布局文件需要用到的属性名及内容 2. 设置用户的Internet权限和关于SD卡的权限 <span style="font-size:14px;">