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

        String path = "http://pic.4j4j.cn/upload/pic/20130909/681ebf9d64.jpg";

        new MulThreadDownload().download(path,3);

    }

    

    public void download (String path,int threadsize) throws Exception{

        URL url = new URL(path);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setConnectTimeout(5000);

        conn.setRequestMethod("GET");

        if(conn.getResponseCode() == 200){

            //获取网络文件长度

            int length = conn.getContentLength();  

            //新建本地文件保存下载数据

            File file = new File(getFilename(path));

            //计算每条线程负责下载的数据量

            int block = length%threadsize==0 ? length/threadsize : length/threadsize+1;

            //开启指定数目的线程同时下载

            for(int threadid = 0; threadid < threadsize; threadid++){

                new DownloadThread(threadid,block,url,file).start();

            }

        }else{

            System.out.println("下载失败!");

        }

    }

    

    private class DownloadThread extends Thread{

        private int threadid;   //线程编号

        private int block;      //下载块大小

        private URL url;        //下载链接

        private File file;      //下载数据保存文件

        public DownloadThread(int threadid, int block, URL url, File file) {

            this.threadid = threadid;

            this.block = block;

            this.url = url;

            this.file = file;

        }

        public void run() {

            int start = threadid * block;       //本线程下载数据写入文件开始位置

            int end = (threadid+1) * block - 1; //本线程下载数据写入文件结束位置

            try {

                //创建一个随机访问文件流对象

                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");

                //文件指针偏移至正确写入位置

                accessFile.seek(start);

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setConnectTimeout(5000);

                conn.setRequestMethod("GET");

                //设置请求数据的范围

                conn.setRequestProperty("Range", "bytes="+start+"-"+end);

                if(conn.getResponseCode() == 206){//状态码206:(部分内容) 服务器成功处理了部分 GET 请求

                    InputStream inStream = conn.getInputStream();

                    byte[] buffer = new byte[1024];

                    int len = 0;

                    while((len = inStream.read(buffer)) != -1){

                        accessFile.write(buffer, 0, len);

                    }

                    accessFile.close();

                    inStream.close();

                }

                System.out.println("第"+(threadid+1)+"部分下载完成");

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

    private String getFilename(String path) {

        return path.substring(path.lastIndexOf("/")+1);

    }

}

时间: 2024-08-09 06:33:34

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.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;

多线程下载文件,以及断点下载

一:前言 多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢? 二:代码示例 直接给出代码, 2.1.经典代码 两行经典的代码分别为: //设置下载的开始及结束位置 conn.setRequestProperty("Range", "bytes="+start+"-"+end+""); //设置读写的起点位置 R

多线程下载文件(支持暂停、取消、断点续传)

多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

多线程实现多线程下载文件

下载文件的时候,一个大文件切成很多片,用多线程下载,速度会快很多 阅读代码的时候注意查看代码里面的注释想用多线程下载文件,则, 第一:得了解  RandomAccessFile  类,这是个随机访问文件类,里面可以设置 访问的 开始地址和结束地址,且该类可读可写. RandomAccessFile out = new RandomAccessFile(file, "rw"); 则表示,该类可读可写.通过 out.seek(start)  可以定位开始读取的位置. 第二:既然是网络文件下

JAVA多线程读写文件范例

在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入引用或转载. 本程序是基于这么一种考虑,某系统后台有个将近2G大小的日志文件,你用任何编辑器去打开它,都将会很困难.针对这样的大文件解析处理,解决方案是使用多个线程,分割读取指定的大文件.获取我们所需要的信息.不多说,上代码了,有注释可以帮助理解. Java代码   package com.thre

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 多线程下载功能

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

安卓 多线程下载文件

HTTP文件多线程下载 测试代码 String downloadUrl = "http://192.168.31.162/FileServer/SoftApk/UC-11.5.5.943.apk"; String filepath = PathUtils.getCachePath() + "UC-11.5.5.943.apk"; /** * 多线程下载 * 基于:http://blog.csdn.net/mad1989/article/details/3842146