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(String[] args) throws Exception {

        //1、连接服务器,获取一个文件,获取文件的长度,在本地创建一个大小跟服务器文件一样大的临时文件
        String path = "http://192.168.1.100:8080/test.avi";
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        int code = conn.getResponseCode();
        if(code==200)
        {

            //服务器返回的数据长度 实际上就是文件的长度
            int length = conn.getContentLength();
            System.out.println("文件总长度:"+length);

            //在客服端创建出来一个大小跟服务器端文件一样大小的临时文件
            RandomAccessFile raf = new RandomAccessFile("test.avi", "rwd");
            //指定创建的这个文件的长度
            raf.setLength(length);
            raf.close();

            //假设是3个线程去下载资源
            //平均每一个线程下载的文件的大小
            int blockSize = length / threadCount;
            for(int threadId=1;threadId<=threadCount;threadId++)
            {
                //线程下载的开始位置
                int startIndex = (threadId-1)*blockSize;
                int endIndex = threadId*blockSize;
                if(threadId==threadCount)
                {
                    endIndex = length;

                }
                System.out.println("线程:"+threadId+" 下载:---"+startIndex+"--->"+endIndex);

                //启动线程
                new DownloadThread(threadId,startIndex,endIndex,path).start();
            }

        }
        else
        {
            System.out.println("服务器错误");
        }

    }

    public static class DownloadThread extends Thread
    {
        private int threadId;  //线程id
        private int startIndex;
        private int endIndex;
        private String path;

        public DownloadThread(int threadId, int startIndex, int endIndex,
                String path) {
            super();
            this.threadId = threadId;
            this.startIndex = startIndex;
            this.endIndex = endIndex;
            this.path = path;
        }

        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn =(HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");

                //重要 : 请求服务器下载部分的文件指定文件的位置
                conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);

                //从服务器请求全部资源 200 ok 如果从服务器请求部分资源 206 ok
                int code = conn.getResponseCode();
                System.out.println("code:"+code);

                //已经设置了请求的位置 返回的事当前位置对应的文件的输入流
                InputStream is = conn.getInputStream();

                //在客服端创建出来一个大小跟服务器端文件一样大小的临时文件
                RandomAccessFile raf = new RandomAccessFile("test.avi", "rwd");
                //随机写文件的时候从哪个位置开始
                raf.seek(startIndex); //定位文件

                int len = 0;
                byte[] buffer = new byte[1024];
                while((len=is.read(buffer))!=-1)
                {
                    raf.write(buffer,0,len);
                }

                is.close();
                raf.close();

                System.out.println("线程:"+threadId+"下载完毕了。。。");

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}
时间: 2024-08-25 15:20:09

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多线程下载器FileDownloader(支持断点续传、代理等功能)

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

java多线程下载

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

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 多线程下载示例

项目结构: 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的二进制可执行文件,如果放置图片的话,中间数据如果出错,不容易用肉眼识别,但是如果是二进制文件的话,如果中间任何二进制的一位数据出错,必然造成二进制可执行文件无法运行!所以测试选择二进制可执行文件比较妥