java多线程下载

多线程下载是通过占有服务器资源来提高速度的。
每个线程应该下载一个文件的不同位置,假如现在有一个长度为10的资源,有三个线程,那么第一个线程下载的长度为012,第二个为345,第四个为6789
所以问题来了每个线程下载的长度是多少呢?
线程的id为0,1,2
每个线程下载的数量=总长度/线程数量
size=10/3
start:id*size
end:(id+1)*size-1
最后一个线程的结束位置为:总长度-1

package down;

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

public class Down {

    static int threadCount = 3;
    static String path = "http://192.168.21.1:8080/ok/ideaIU-14.1.3.exe";

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);
            if(conn.getResponseCode()==200){
                //第一次请求要下载的长度
                int length = conn.getContentLength();
                //应该从字符串中截取文件名称
                File file = new File("ideaIU-14.1.3.exe");
                //在下载之前生成临时文件,占位置
                RandomAccessFile rdm = new RandomAccessFile(file, "rwd");
                //给临时文件大小
                rdm.setLength(length);
                //关闭
                rdm.close();
                //计算每个线程应该下载的长度
                int size = length/threadCount;
                //为每个线程分配开始位置和结束位置
                for (int i = 0; i <threadCount; i++) {
                    int start = i*size;
                    int end = (i+1)*size-1;
                    //最后一个线程的结束位置为总长度
                    if(i==threadCount-1){
                        end= length;
                    }
                    System.out.println(i+"线程下载区间"+start+"---"+end);
                    //每次都调用新的线程
                    new DownThread(start, end, i).start();
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
//线程
class DownThread extends Thread{
    private int start;
    private int end;
    private int threadId;

    public DownThread(int start, int end, int threadId) {
        this.start = start;
        this.end = end;
        this.threadId = threadId;
    }

    @Override
    public void run() {
        try {
            //再次请求网络
            URL url = new URL(Down.path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);
            //设置本次请求的文件的长度
            conn.setRequestProperty("Range","bytes="+start+"-"+end);
            //请求部分数据是206
            if(conn.getResponseCode()==206){
                //得到请求长度的文件输入流
                InputStream is = conn.getInputStream();
                byte[] b = new byte[1024];
                int len = 0;
                //记录每一次下载字节数
                int totle =0;
                //应该从字符串中截取文件名称
                File file = new File("ideaIU-14.1.3.exe");
                //拿到之前占位置那个文件,相当于输出流
                RandomAccessFile rdm = new RandomAccessFile(file, "rwd");
                //改变写入文件的开始位置
                rdm.seek(start);
                while((len=is.read(b))!=-1){
                    //每次读取流里的数据写到临时文件里
                    rdm.write(b, 0, len);
                    totle += len;
                    System.out.println(threadId+"线程"+"下载了"+totle);
                }
                rdm.close();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
时间: 2024-12-25 15:53:44

java多线程下载的相关文章

最新---java多线程下载文件

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { // 定义线程个数 public static int threadCount = 5; public static void main(String[] args) throws Exception { // 1,连接到服务

java 多线程下载功能

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { private static int threadCount = 3; /** * 多线程下载测试类 * @param args * @throws Exception */ public static void main(S

Java多线程下载文件

package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /*  * 多线程下载  */ public class MulThreadDownload {     public static void main(String[]

JAVA 多线程下载及断点续传

断点续传和多线程下载原理是一样的; 关键代码关键位置:即设置断点 http2.setRequestProperty("RANGE","bytes="+startl+"-");//设置断点位置,向服务器请求从文件的哪个字节开始读取.osf.seek(startl);//设置本地文件从哪个字节开始写入. 如果是单线程,则首先要判断下载文件是否已经存在;如果存在则开始断点续传,方法同多线程:因为断点续传是从上次传输中断的字节开始,则首先要得到上次中断的

Java多线程下载器FileDownloader(支持断点续传、代理等功能)

前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownloader 目前实现的主要功能有: 多线程下载 断点续传 自定义头部等 即将完成的包括: 添加代理功能 ... 感觉做了回标题党,代理功能由于时间关系,将在下次更新加入. 关于设置代理,我这篇文章 Java实现Ip代理池 中有具体的设置方法. 另外除了这个代理功能,我也实在不知道下载器能加些啥功能了..

Java 多线程下载示例

项目结构: FileDownload.java: package com.wl.download; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.text.DecimalFormat; import org.apache.http.HttpResponse; import org.

java多线程下载文件和断点下载

多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile;

java 多线程下载

1 import java.io.ByteArrayOutputStream; 2 import java.io.InputStream; 3 4 public class StreamTool { 5 /** 6 * 把一个inputstream里面的内容转化成一个byte[] 7 */ 8 public static byte[] getBytes(InputStream is) throws Exception { 9 ByteArrayOutputStream bos = new Byt

JavaSE多线程下载的实现

本文中主要提供的是java多线程下载文件方案,以及java多线程将临时进度保存到文件,多线程断点续传的实现: 1.多线程下载 2.将下载进度保存到临时文件,多线程的断定续传 1.多线程下载 本例中首先在Tomcat服务器中的WEBAPP/ROOT/文件夹下面放置了SoftwareOffer.exe的二进制可执行文件,如果放置图片的话,中间数据如果出错,不容易用肉眼识别,但是如果是二进制文件的话,如果中间任何二进制的一位数据出错,必然造成二进制可执行文件无法运行!所以测试选择二进制可执行文件比较妥