`
savasun
  • 浏览: 5292 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JAVA写的WEB迅雷

阅读更多

实现原理:

 用httpConnection.setRequestProperty("RANGE" , "bytes= xxx -xxx" );获取指定的数据块

用RandomAccessFile实现文件随机访问,写入指定数据块到文件.

关键事项:获取远程文件大小,根据文件大小确定下载线程个数(可固定线程数,也可固定每个线程下载数据块大小,用户自己决定).

 

package org.ifusing.down;

 

import java.io.*;

import java.net.*;

/**

  * 文件下载管理类

  */

public class DownLoadManager {

    /**

      * 每个线程下载的字节数

      */

    static final long unitSize = 100 * 1024;

 

    /**

      * 启动多个线程下载文件

      */

    public void doDownload(String remoteFileUrl)

            throws IOException {

       

        String fileName = new URL(remoteFileUrl).getFile();

        fileName = fileName.substring(fileName.lastIndexOf( "/" )+1,fileName.length()).replace( "%20" , " " );

           

        long fileSize = this .getRemoteFileSize(remoteFileUrl);

 

        if (fileSize == 0){

            return ;

        }

       

        this .createFile(fileName, fileSize);

 

        long threadCount = fileSize / unitSize ;

        System. out .println( " 共启动 "

                + (fileSize % unitSize == 0 ? threadCount : threadCount + 1)

                + " 个线程" );

 

        long offset = 0;

        if (fileSize <= unitSize ) { // 如果远程文件尺寸小于等于unitSize

            DownloadThread downloadThread = new DownloadThread(remoteFileUrl,

                    fileName, offset, fileSize);

            downloadThread.start();

        } else { // 如果远程文件尺寸大于unitSize

            for ( int i = 1; i <= threadCount; i++) {

                DownloadThread downloadThread = new DownloadThread(

                        remoteFileUrl, fileName, offset, unitSize );

                downloadThread.start();

 

                offset = offset + unitSize ;

            }

            if (fileSize % unitSize != 0) { // 如果不能整除,则需要再创建一个线程下载剩余字节

                DownloadThread downloadThread = new DownloadThread(

                        remoteFileUrl, fileName, offset, fileSize

                                - unitSize * threadCount);

                downloadThread.start();

 

            }

        }

 

    }

 

    /**

      * 获取远程文件尺寸

      */

    private long getRemoteFileSize(String remoteFileUrl) throws IOException {

 

        long fileSize = 0;

        HttpURLConnection httpConnection = (HttpURLConnection) new URL(

                remoteFileUrl).openConnection();

       

        httpConnection.setRequestMethod( "HEAD" );

       

        int responseCode = httpConnection.getResponseCode();

        if (responseCode >= 400){

            System. out .println( "Web 服务器响应错误!" );

            return 0;

        }

       

        String sHeader;

        for ( int i=1;;i++){

            sHeader = httpConnection.getHeaderFieldKey(i);

            if (sHeader != null && sHeader.equals( "Content-Length" )){

                System. out .println( " 文件大小ContentLength:" +httpConnection.getContentLength());

                fileSize = Long.parseLong (httpConnection.getHeaderField(sHeader));

                break ;

            }

        }

 

        return fileSize;

    }

 

    /**

      * 创建指定大小的文件

      */

    private void createFile(String fileName, long fileSize) throws IOException {

        File newFile = new File(fileName);

        RandomAccessFile raf = new RandomAccessFile (newFile, "rw" );

 

        raf.setLength(fileSize);

 

        raf.close();

    }

 

}

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package org.ifusing.down ;

 

import java.io.BufferedInputStream;

import java.io.File;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

 

/**

  * 负责文件下载的类

  */

public class DownloadThread extends Thread {

    /**

      * 待下载的文件

      */

    private String url = null ;

 

    /**

      * 本地文件名

      */

    private String fileName = null ;

 

    /**

      * 偏移量

      */

    private long offset = 0;

 

    /**

      * 分配给本线程的下载字节数

      */

    private long length = 0;

 

    /**

      * @param url 下载文件地址

      * @param fileName 另存文件名

      * @param offset 本线程下载偏移量

      * @param length 本线程下载长度

      *

      * @author Angus.wang

      * */

    public DownloadThread(String url, String file, long offset, long length) {

        this . url = url;

        this . fileName = file;

        this . offset = offset;

        this . length = length;

        System. out .println( " 偏移量=" + offset + "; 字节数=" + length);

    }

 

    public void run() {

        try {

            HttpURLConnection httpConnection = (HttpURLConnection) new URL(

                    this . url ).openConnection();

 

            httpConnection.setRequestMethod( "GET" );

            httpConnection.setRequestProperty( "RANGE" , "bytes=" + this . offset

                    + "-" + ( this . offset + this . length - 1));

           

            System. out .println( "RANGE bytes=" + this . offset + "-" + ( this . offset + this . length - 1) http://www.kcvg.cn 原创);

 

           

            BufferedInputStream bis = new BufferedInputStream(httpConnection

                    .getInputStream());

 

            byte [] buff = new byte [1024];

            int bytesRead;

            File newFile = new File( fileName );

            RandomAccessFile raf = new RandomAccessFile(newFile, "rw" );

           

           

            while ((bytesRead = bis.read(buff, 0, buff. length )) != -1) {

                raf.seek( this . offset );

                raf.write(buff, 0, bytesRead);

               

                this . offset = this . offset + bytesRead;

            }

           

            raf.close();

            bis.close();

        } catch (IOException ioe) {

            ioe.printStackTrace();

        }

 

    }

 

}

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package org.ifusing.downtest ;

 

/**

  * 多线程文件下载测试

  * */

public class FileDownloadTest {

 

    /**

      * @param args

      */

    public static void main(String[] args) {

        try {

            String remoteFileUrl = "http://dl_dir.qq.com/qqfile/qq/QQ2009/QQ2009SP5.exe" ;

           

            DownLoadManager downLoadManager = new DownLoadManager();

           

            downLoadManager.doDownload(remoteFileUrl);

        } catch (Exception e){

            e.printStackTrace();

        }

       

 

    }

 

}

分享到:
评论

相关推荐

    孙卫琴.Tomcat与Java.Web开发技术详解(3)

    孙卫琴.Tomcat与Java.Web开发技术详解.part3.rar 分三次压缩,第四为源码

    Java Web整合开发王者归来

    Java Web整合开发王者归来

    java浏览器和迅雷源代码

    Java浏览器和迅雷源代码是两个相关项目,主要用于学习和理解如何使用Java语言来实现浏览器功能和模拟迅雷下载机制。这两个项目可以帮助开发者深入理解网络通信、网页解析以及多线程下载等关键技术。 首先,Java...

    架构探险 从零开始写javaweb框架书上源码

    《架构探险:从零开始写JavaWeb框架》是一本深入探讨JavaWeb开发技术的书籍,其核心内容是通过源码分析来帮助读者理解并构建自己的Web框架。书中的源码提供了实际的编程实践,使读者能够亲身体验到JavaWeb框架的实现...

    JAVA项目开发全程实录PDF+代码

    《JAVA项目开发全程实录》是一本深入浅出的Java编程实践指南,旨在帮助读者从理论到实践,全面掌握Java项目开发的各个环节。这本书涵盖了从项目规划、设计、编码、测试到部署的全过程,是Java开发者提升技能和经验的...

    2018迅雷面试题

    根据提供的文件信息,我们可以将重点放在“2018迅雷面试题”的相关内容上,特别是与Java相关的面试知识点。下面将结合标题、描述以及部分内容,提取出与Java相关的面试知识点。 ### Java相关知识点 #### 1. Java...

    java的开发视频教程

    通过下载提供的"java的开发视频教程.downlist"文件,你可以利用迅雷或其他下载工具获取完整的教程资源,开始你的Java Web开发之旅。这套教程对于想系统学习和提升Java Web技能的开发者来说,是一份宝贵的资料。

    完整版Java全套入门培训课件 Java基础 01-Java概述(共31页).pptx

    1. J2EE(Java 2 Platform Enterprise Edition)企业版,主要用于开发企业级应用程序,如Web应用,包含Servlet和JSP等技术。 2. J2SE(Java 2 Platform Standard Edition)标准版,是其他两个版本的基础,适用于桌面...

    迅雷java高级程序员-面试归来-2010-05-21

    ### 迅雷Java高级程序员面试经验分享 #### 一、面试流程回顾 迅雷作为国内知名的互联网企业之一,在招聘Java高级程序员时采取了严格的筛选流程。本次面试经历从下午2点半持续到了晚上8点,共计5.5小时,主要包括了...

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发的java web轻量级小巧视频网站系统

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...

    韩顺平Java-javaEE全套迅雷下载地址.txt

    Java EE 是用于开发可伸缩的企业级应用程序的平台标准,涵盖了Java SE的所有特性,并在此基础上添加了面向企业级开发的功能,如Web服务、事务处理、安全性和持久化层的支持等。 #### 1. Web 应用开发 - **Servlet**...

    毕老师java基础笔记总结

    - **J2EE(Java 2 Platform Enterprise Edition)**:企业版,针对Web应用和企业级系统的开发。 - **J2ME(Java 2 Platform Micro Edition)**:小型版,主要用于移动设备和嵌入式系统。 **1.2.3 Java版本更迭** -...

    北京Java私塾Java基础入门教程

    Java的特点包括简单性、面向对象、健壮性、安全性以及高效性,使得它在Web应用、移动应用、企业级应用等领域都有广泛应用。 二、Java环境配置 学习Java首先需要安装Java Development Kit (JDK),它是开发和运行Java...

    java 视频教学 下载地址

    Java是一种广泛使用的编程语言,在软件开发、Web应用、移动应用(尤其是Android应用)等领域有广泛应用。 #### 描述解析: - **描述:“完整的java视频教学。打开迅雷,再复制网址即可下载!!!”**:这段描述强调...

    利用java做的下载软件

    【标题】:“利用Java做的下载软件”是一种基于Java编程语言实现的多线程下载工具,它的功能和操作体验类似于市面上流行的迅雷下载器。这款软件的设计与实现充分展示了Java在处理网络数据传输和多任务并发方面的强大...

    JAVA 范例大全 光盘 资源

    实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 第21章 Java程序综合案例:教务处...

    java初高级教程

    首先,对于初学者,"java私塾初级视频在线观看.html"和"java私塾初级视频迅雷下载.html"提供了基础的Java教程资源。这些资源通常会涵盖Java语言的基础语法,包括数据类型、变量、控制结构(如if语句和循环)、类与...

    【阳哥笔记】极速秒杀Java基础之笔记系列—Day01(Java概述)!

    - **Java EE (Java Platform Enterprise Edition)**:为企业级应用提供了一套完整的解决方案,包括Servlet、JSP等技术,主要用于Web应用开发。 - **Java SE (Java Platform Standard Edition)**:是Java体系的基础...

Global site tag (gtag.js) - Google Analytics