多线程下载(转)

原文是在52上下载的。

感觉我们对IO和URL这些不够熟悉.很简单的.之前自己尝试过,感觉复杂化了,但也不好说.其实最想要的还是类似idm这种多线程,呵呵.

代码:

package com.test_four;

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

public class Demo {
    public static int threadCount = 3;
    public static void main(String[] args) throws Exception {
//   1.连接服务器,获取一个文件,获取一个文件,获取文件的长度,在本地创建一个大小和服务器文件一样大的临时文件
        String path = "https://admdownload.adobe.com/bin/livebeta/flashplayer24_va_install.exe";
        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("xxx.exe", "rw");
//          指定创建的这个文件的长度
            raf.setLength(length);
            raf.close();
//           假设是三个线程去下载资源
//       平均每一个线程下载的文件的大小
            int blockSize = length/threadCount;
            for(int threadId = 1;threadId<=threadCount;threadId++){
//                第一个线程下载的开始位置
                int startIndex = (threadId -1)*blockSize;
                int endIndex = threadId*blockSize -1;
                if (threadId == threadCount) {//最后一个线程下载的长度要稍微长一点
                    endIndex = length;
                }
                System.out.println("线程:"+ threadId +"下载:---"+ startIndex +"--->"+ endIndex);
                new DownloadThread(path, threadId, startIndex, endIndex).start();
            }
        } else {
            System.out.println("服务器错误");
        }

    }
    public static class DownloadThread extends Thread{
        private int threadId;
        private int startIndex;
        private int endIndex;
        private String path;
        @Override
        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setConnectTimeout(5000);
                connection.setRequestMethod("GET");
//                重要:请求服务器下载部分的文件指定文件的位置
                connection.setRequestProperty("Range","bytes=" + startIndex +"-" +endIndex);
                int code = connection.getResponseCode();//从服务器请求全部资源200 ok   如果从服务器请求部分资源206 ok
//                System.out.println("code:" + code);
                InputStream is =connection.getInputStream();//已经设置了请求的位置,返回的是当前位置对应的文件的输入流
                RandomAccessFile raf = new RandomAccessFile("xxx.exe", "rw");
                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 (IOException e) {
                e.printStackTrace();
            }
        }

        /*
         * threadId 线程id
         * startIndex 线程下载的开始位置
         * endIndex 线程下载的结束位置
         * path 下载文件在服务器的路径
         */
        public DownloadThread(String path,int threadId, int startIndex, int endIndex) {
            super();
            this.threadId = threadId;
            this.startIndex = startIndex;
            this.endIndex = endIndex;
            this.path = path;
        }
    }

}
时间: 2024-10-03 10:27:50

多线程下载(转)的相关文章

linux下多线程下载工具axel的编译安装

axel 是Linux 命令行下多线程的下载工具,支持断点续传,速度通常情况下是Wget的几倍 官方主页:http://axel.alioth.debian.org/ 源码下载: #curl -O http://pkgs.fedoraproject.org/repo/pkgs/axel/axel2.4.tar.gz/a2a762fce0c96781965c8f9786a3d09d/axel-2.4.tar.gz 编译安装: # tar -xvf axel-2.4.tar.gz  && cd

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

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

J哥---------Android 多线程下载 仿下载助手(改进版)

首先声明一点: 这里的多线程下载 并不是指的 多个线程下载一个 文件,而是 每个线程 负责一个文件.真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群  -------------  -------------android交流群:230274309------------- -------------一起分享,一起进步!  需要你们-------------- --------------  期待各位爱学习的小伙伴们 的到来------------

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

java实现多线程下载

本篇博客可认为是对 使用java实现http多线程下载 一文的再次解读. 首先,从宏观来说 java实现多线程下载这个功能的实现由以下几部分组成: 1 建立多个线程去分别下载文件的一部分. 2 将多个线程下载的文件(还在内存中),写入硬盘中的一个文件. 3 断点续传 GET /Path/FileName HTTP/1.0 Host: www.server.com:80 Accept: */* User-Agent: GeneralDownloadApplication Connection: c

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

Android版多线程下载器核心代码分享

首先给大家分享多线程下载核心类: 1 package com.example.urltest; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.RandomAccessFile; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 im

Android 之多线程下载原理

在Android之中呢,对于多线程的操作很是平凡,所以对于多线程的理解越深,那么对于自己的程序便能够很好的运行 这也是对于Android开发是一个重要的知识点,那么我们现在来了解多线程的下载原理. android 多线程下载 多线程下载步骤: 1.本地创建一个跟服务器一样的大小一样的文件 临时文件. 2.计算分配几个线程去下载服务器上的资源 每个文件下载的位置. 3.开启线程,每一个线程下载对应的文件. 4.如果所有的线程都把自己的数据下载完成了,服务器上的资源就被下载到本地了 如图所示:(假设