JAVA IO 之多线程下载

来源:互联网 发布:楼梯踏步高度算法 编辑:程序博客网 时间:2024/06/05 09:11


                            JAVA   多线程下载   




1.多线程下载是基于JavaIO流 和线程的一种技术,类似于迅雷下载的功能,可以满足在网上下载东西的基本需求,当然这对于一个菜鸟新手肯定觉得是很能装B的。


2.首先我们要了解多线程下载的原理,原理如下图,

上图为我们的思路图,有需要定于的参数和需要使用的类,

1.需要使用的类为,HttpUrlConnection  ,这是从服务器中拿东西,RandomAccessFile   ,用于在本地保存文件。


上图将怎么下载分成两份,一份服务器端,一份客户端。


2.服务端需要用到的参数:

    int  filesize  :  文件大小

    int  threadindex: 线程个数

    int  singlethreadNum : 每个线程下载多大(计算公式为:singlethreadNum=filesize%threadsize==0?filesize/thread:filesize/threadsize+1)

    int  startPosition  :每个线程下载的开始位置   (计算公式为:threadindex*singlethreadNum)

    int  endPosition   :每个线程下载的结束位置     (计算公式为:(threadindex+1)*singlethreadNum-1)



以上是需要用到的参数

       代码如下:

      /*

           测试类

       */

package Com.zking.test;

import java.io.File;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class TestDown {
    public static void main(String[] args) {
        //设置线程数
        int threadnum=50;
        //下载路径
        String path="http://localhost:8080/web_luopenghui/images/s8.jpg";
        //httpurlconnection
        try {
            //获取下载地址
            URL url=new URL(path);
            //通过下载地址打开连接
            HttpURLConnection conn=(HttpURLConnection)url.openConnection();
            //设定请求方式
            conn.setRequestMethod("GET");
            //判断响应码是否为200  只有200的时候才会进入这个网页
            if(conn.getResponseCode()==200){
                //获取服务器中文件的大小
                int length=conn.getContentLength();
                //保存的文件路径
                File f=new File("C:/s8.jpg");
                //对随机的文件进行读写
                RandomAccessFile raf=new RandomAccessFile(f,"rwd");
                //设置下载文件大小
                raf.setLength(length);
                raf.close();
                //每个线程下载的数据量
                int singleThreadNum= length%threadnum==0 ? length/threadnum:length/threadnum+1;
                    
                for (int i = 0; i < threadnum; i++) {
                        new DownThread(i, url, f, singleThreadNum).start();
                }
                
            }else{
                System.out.println("网页错误");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


 //线程下载类

package Com.zking.test;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownThread extends Thread{
    public int id;//线程id
    public URL url;//文件下载的路径
    public File file;//文件保存的路径
    public int singlethreadNum;//每个下载的数据量
    
    
    public DownThread(int id, URL url, File file, int singlethreadNum) {
        super();
        this.id = id;
        this.url = url;
        this.file = file;
        this.singlethreadNum = singlethreadNum;
    }
    
    @Override
    public void run() {
        try {
            RandomAccessFile raf=new RandomAccessFile(file, "rwd");
            //分别计算每个下载的开始位置和结束位置
            int start=id*singlethreadNum;
            int end=(id+1)*singlethreadNum-1;
            //通过传过来的URL 获取下载的连接
            HttpURLConnection conn=(HttpURLConnection) url.openConnection();
            //设置下载超时值
            conn.setReadTimeout(5000);
            //设置一般请求属性
            conn.setRequestProperty("Range", "bytes="+start+"-"+end);
            //局部请求  状态码为206
            if(conn.getResponseCode()==206){
                raf.seek(start);
                //获取输入流
                InputStream is=conn.getInputStream();
                
                byte[] bytes=new byte[1024];
                int len=0;
                while((len=is.read(bytes, 0, bytes.length))!=-1){
                    raf.write(bytes, 0, len);
                }
                raf.close();
                is.close();
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    
}



代码基本也就在这了,大家去了解了解

如果不懂,回复评论,有时间会看的,然后在交流,我也有自己录下的视频,可以交流交流,也可以加QQ  739560489   

  


  




原创粉丝点击