利用URL(网络资源统一定位符),我们可以进行文件的定位和下载,

如果我们想让下载速度提高一些,我们通常有以下方法:

1.提高网络带宽,提升网络速度

2.开通网站vip,实现高速下载或上传

3.新增下载线程,实现多线程同时下载

通常情况下,方法1是作为一个普通程序员是无法实现的,因为网络带宽是由网络运行商限定,

除非我们多交钱或者是开通专用通道(vpn),

方法2的话,也是需要花钱,比如某云盘,只要你充值会员,就可以实现高速下载或是上传文件,

其实,我说那么多都是废话,我想分享给大家的就是方法3,利用URL进行多线程下载,

由于代码注释我都写的很明了,所有直接上代码了,下面就是主类代码,不需引入三方jar包,可直接运行,

运行该类可以从hao123网站下载一个输入法,当然了,URL地址可以随便更改。

package com.yc.net;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;/*** 多线程下载* * @author jam**/
public class ThreadDownloader {public static void main(String[] args) throws IOException, InterruptedException {// 记录开始下载的时间long begin_time = new Date().getTime();// 创建一个URL链接// 从hao123网站下载一个输入法,下面是下载地址URL url = new URL("http://softdown1.hao123.com/hao123-soft-online-bcs/soft/2017_09_29_jpwb2017qj.exe");// 获取连接URLConnection conn = url.openConnection();// 获取文件全路径String fileName = url.getFile();// 获取文件名fileName = fileName.substring(fileName.lastIndexOf("/"));System.out.println("开始下载>>>");// 获取文件大小int fileSize = conn.getContentLength();System.out.println("文件总共大小:" + fileSize + "字节");// 设置分块大小int blockSize = 1024 * 1024;// 文件分块的数量int blockNum = fileSize / blockSize;if ((fileSize % blockSize) != 0) {blockNum += 1;}System.out.println("分块数->线程数:" + blockNum);Thread[] threads = new Thread[blockNum];for (int i = 0; i < blockNum; i++) {// 匿名函数对象需要用到的变量final int index = i;final int finalBlockNum = blockNum;final String finalFileName = fileName;// 创建一个线程threads[i] = new Thread() {public void run() {try {// 重新获取连接URLConnection conn = url.openConnection();// 重新获取流InputStream in = conn.getInputStream();// 定义起始和结束点int beginPoint = 0, endPoint = 0;System.out.print("第" + (index + 1) + "块文件:");beginPoint = index * blockSize;// 判断结束点if (index < finalBlockNum - 1) {endPoint = beginPoint + blockSize;} else {endPoint = fileSize;}System.out.println("起始字节数:" + beginPoint + ",结束字节数:" + endPoint);// 将下载的文件存储到一个文件夹中//当该文件夹不存在时,则新建File filePath = new File("E:/temp_file/");if (!filePath.exists()) {filePath.mkdirs();}FileOutputStream fos = new FileOutputStream(new File("E:/temp_file/", finalFileName + "_" + (index + 1)));// 跳过 beginPoint个字节进行读取in.skip(beginPoint);byte[] buffer = new byte[1024];int count;// 定义当前下载进度int process = beginPoint;// 当前进度必须小于结束字节数while (process < endPoint) {count = in.read(buffer);// 判断是否读到最后一块if (process + count >= endPoint) {count = endPoint - process;process = endPoint;} else {// 计算当前进度process += count;}// 保存文件流fos.write(buffer, 0, count);}fos.close();in.close();} catch (Exception e) {e.printStackTrace();}}};threads[i].start();}// 当所有线程都结束时才开始文件的合并for (Thread t : threads) {t.join();}// 若该文件夹不存在,则创建一个文件夹File filePath = new File("E:/download/");if (!filePath.exists()) {filePath.mkdirs();}// 定义文件输出流FileOutputStream fos = new FileOutputStream("E:/download/" + fileName);for (int i = 0; i < blockNum; i++) {FileInputStream fis = new FileInputStream("E:/temp_file/" + fileName + "_" + (i + 1));byte[] buffer = new byte[1024];int count;while ((count = fis.read(buffer)) > 0) {fos.write(buffer, 0, count);}fis.close();}fos.close();long end_time = new Date().getTime();long seconds = (end_time - begin_time) / 1000;long minutes = seconds / 60;long second = seconds % 60;System.out.println("下载完成,用时:" + minutes + "分" + second + "秒");}}

该类利用了多线程进行文件的下载,等到每个线程都下载完成后,我们将每个线程下载好的文件合并为一个完整的文件。

可以看到,三个线程同时进行下载,下图展示了临时文件的存储情况:

程序成功运行完后,控制台输出情况如下:

当所有的线程都下载好了临时文件后,程序会将这些临时文件合并为一个完整的文件:

这个时候,我们可以看到一个完整的文件已经下载到了我们指定的文件夹中了,这样,我们利用URL进行多线程下载就成功了。

该文章只是作为我学习URL和多线程的笔记,刚入门的童鞋可以参考一下,如有错误,欢迎指正。

文章属原创,如需引用,请注明出处,谢谢。

Java利用URL实现文件下载相关推荐

  1. JAVA利用URL从网上下载音乐资源

    package yu.hang;import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURL ...

  2. java下载mp3_Java如何利用url下载MP3保存到本地?

    展开全部 Java如何利用url下载32313133353236313431303231363533e78988e69d8331333365646234MP3保存的方法: 1 /** : 2      ...

  3. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  4. java.net import_import java.net.URL;是什么类?

    展开全部 java.net.URL中定义了URL相关的操作,其主要利用的是openStream();方法来返回一个InputStream,然后可以使用InputStreamReader和Buffere ...

  5. 对Java的URL类支持的协议进行扩展的方法

    转载自   对Java的URL类支持的协议进行扩展的方法 JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持.当我们要利用这些协议来 ...

  6. java利用htmlparser得到网页html内容

    java利用htmlparser得到网页html内容,利用org.htmlparser.Parser包我们可以很轻松取到任何页面的源代码,方法如下: /*** 返回网页内容* * @param pat ...

  7. Java利用jenkins做项目的自动化部署

    本地的jekins密码 2722e8ea873b4cf08884c22dff732bab 这篇文章主要介绍了Java利用jenkins做项目的自动化部署,小编觉得挺不错的,现在分享给大家,也给大家做个 ...

  8. Java 利用ffmpeg工具实现视频MP4转m3u8

    Java 利用ffmpeg工具实现视频MP4转m3u8(一) 前言 (一)ffmpeg工具转码 1.如何安装ffmpeg工具 2.如何使用ffmpeg工具进行视频转码 (二)播放m3u8文件 1.vi ...

  9. 利用URL查看网页源代码

    文章目录 前言 一.利用URL查看网页源代码 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一.利用URL查看网页源代码 package http;import java.io.IOExcep ...

  10. 利用URL语法命令,API 接口获取淘宝天猫,拼多多,1688 商品详情等平台,其他API接口

    cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行.它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具.cURL还包含了用于程序开发的libcurl ...

最新文章

  1. Qt中打开excel文件
  2. 原码、反码、补码、移码的表示
  3. 专注jQurey的博客【2012年度IT博客大赛分类推荐】
  4. 服务器主板装w7系统死机,解决win7安装过程死机现象有一招
  5. 辅助类BinaryTreeNode(二叉树节点)
  6. html转word 时 字体颜色,【Web前端问题】文字大小和颜色随着热度改变如何做?...
  7. zklib php,php 安装zookeeper扩展报错
  8. cf519D . A and B and Interesting Substrings 数据结构map
  9. 转 海量数据处理(2)
  10. c语言倒计时不影响进程_初学C语言没有项目练手怎么行,这17个小项目收下不谢...
  11. 直播app源码开发,聊天服务器的搭建教程
  12. 李雅普诺夫指数的计算
  13. 台式计算机如何自动开关机,台式机怎么设置自动开关机
  14. Python 最常见的 170 道面试题解析:2019 最新
  15. PUBWIN密码攻防战 打造永攻不破的密码!(转)
  16. java 时区-东八区
  17. Vue中components几个组件
  18. html css图片平铺整个页面,css 样式 图片平铺整个界面
  19. 关于Anaconda Navigator卡在Adding Featured Channels的解决办法
  20. 山东大学项目实训开发日志——基于vue+springboot的医院耗材管理系统(2)

热门文章

  1. dd模式和iso模式_ISO的完整形式是什么?
  2. Oracle JDE 系统架构总结..
  3. log4j日志设置error级别以上
  4. PDMS二次开发(八)——向PDMS12.1版本迁移
  5. 文件服务器minio
  6. Xshell官网免费版
  7. SPSS 26 资源及安装教程
  8. 威纶触摸屏使用说明书_PLC变频器触摸屏综合实训
  9. 把图片url 伪静态 php,php使动态URL标签链接转成伪静态
  10. Oracle下载12c安装包