如果要实现多线程下载,可以定义以下步骤:

1)创建URL对象(URL代表统一资源定位器)

URL url=new URL(path);//path资源路径

2)获取URL对象指向资源的大小,使用URLConnection类,该类代表应用程序和URL之间的通信链接。

HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//以GET方式获取
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
fileSize=conn.getContentLength();//得到文件大小

conn.disconnect();

3)在本地磁盘上创建一个与网络资源相同大小的空文件

RandomAccessFile files=new RandomAccessFile(targetFile, "rw");
files.setLength(fileSize);//设置文件大小
files.close();//关闭文件

4)创建线程,计算每个线程下载资源的大小并启动线程

代码如下:

import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;public class DownUtil {private String path;//下载地址private String targetFile;//文件保存位置private int threadNumber;//下载的线程数private int fileSize;//文件总大小private DownThread[] downThreads;//下载线程对象public DownUtil(String path,String targetFile,int threadNumber){this.path=path;this.targetFile=targetFile;this.threadNumber=threadNumber;downThreads=new DownThread[threadNumber];//初始化数组}public void download() throws Exception{URL url=new URL(path);HttpURLConnection conn=(HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setRequestProperty("Accept-Language", "zh-CN");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Connection", "Keep-Alive");fileSize=conn.getContentLength();//得到文件大小conn.disconnect();int currentPartSize=fileSize/threadNumber+1;//每线程对象下载文件的大小RandomAccessFile files=new RandomAccessFile(targetFile, "rw");files.setLength(fileSize);//设置文件大小files.close();//关闭文件for(int i=0;i<threadNumber;i++){int start=i+currentPartSize;//每个线程下载的起始位置RandomAccessFile file=new RandomAccessFile(targetFile, "rw");file.seek(start);//定位下载位置downThreads[i]=new DownThread(path,start,currentPartSize,file);downThreads[i].start();//启动线程}}}
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;public class DownThread extends Thread{private int start;//下载线程起始位置private int currentPartSize;//该线程下载文件的大小private RandomAccessFile file;//存放的文件private String path;//下载地址private int length;//该线程已经下载的文件大小public DownThread(String path,int start,int currentPartSize,RandomAccessFile file){this.start=start;this.currentPartSize=currentPartSize;this.file=file;this.path=path;}@Overridepublic void run() {URL url;try {url = new URL(path);HttpURLConnection conn=(HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setRequestProperty("Accept-Language", "zh-CN");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Connection", "Keep-Alive");InputStream in=conn.getInputStream();in.skip(start);//跳过start个字节,每个线程只负责下载自己的文件byte[] buffer=new byte[1024];int hasRead=0;while(length<currentPartSize&&(hasRead=in.read(buffer))!=-1){file.write(buffer, 0, hasRead);length+=hasRead;}file.close();in.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/40783867     情绪控_

Java网络编程笔记2相关推荐

  1. Java网络编程笔记5

    在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...

  2. Java网络编程笔记

    Java网络编程 14-1 网络编程概述 14-2 网络通信要素概述 14-3 通信要素一:IP和端口号 InetAddress类测试 14-4 通信要素二:网络协议 14-5 TCP网络编程 TCP ...

  3. Java网络编程笔记4

    Socket和ServerSocket,网络编程可以分为创建Socket.打开连接Socket的输入流和输出流,对Socket进行编程,关闭Socket. 创建Socket 一个功能齐全的Socket ...

  4. Java网络编程笔记1

    网络编程的基础知识 什么叫计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备通信线路互连成一个规模大.功能强的网络系统. 计算机网络主要能做些以下功能: 1)资源共享 2)信息传输与集中处理 ...

  5. Java网络编程笔记3

    如何使用POST请求和GET请求向Web站点发送请求,参考以下代码: import java.io.BufferedReader; import java.io.InputStream; import ...

  6. Java网络编程笔记6

    在前几遍文章中,我们已经知道了客户端与服务器通信,包括多个客户端与服务器的通信,接下来我们演示下客户端与服务器的完整通信过程. 先看效果图 客户端1 客户端2 服务器端 服务器线程类: <spa ...

  7. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  8. 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

    菜鸟学习笔记:Java提升篇9(网络1--网络基础.Java网络编程) 网络基础 什么是计算机网络 OS七层模型 Java网络编程 InetAddress InetSocketAddress URL类 ...

  9. JAVA网络编程个人笔记 第4章 inet地址

    JAVA网络编程个人笔记 第4章 inet地址 Internet寻址 创建InetAddress对象 常用方法 getLocalHost() 代码实现 getByName() 代码实现 getAllB ...

最新文章

  1. 《JS权威指南学习总结--第十一章子集和扩展》
  2. CALayer(二)
  3. 简单记录js中的this关键字
  4. 一步一步详解ID3和C4.5的C++实现
  5. 309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期
  6. 给 EF Core 查询增加 With NoLock
  7. Unix/Linux环境C编程入门教程(27) 内存那些事儿
  8. mysql57服务无法启动_将mysqld.service服务加入到systemctl
  9. matlab中noisbloc,基于小波变换的微弱信号检测技术的研究.doc
  10. 使用控制结构——循环语句——基本循环
  11. MySQL 5.7 主从复制配置
  12. idea 检测 重复代码_IDEA关掉重复代码波浪线
  13. java抓取动态生成的网页
  14. java 邮件客户端 smtp_java网络编程三:基于SMTP的邮件发送客户端
  15. java drools5_【java规则引擎】drools6.5.0版本api简介
  16. 大数据技术在网络安全分析的作用
  17. 适用于stuido one的虚拟贝斯手插件:UJAM Virtual Bassist ROYAL for Mac
  18. 在linux上安装svn
  19. 怎样给家庭组计算机授权,steam如何设置家庭共享?steam设置家庭共享方法
  20. Linux添加WIFI驱动

热门文章

  1. python如何对两个矩阵进行拼接_Python合并两个numpy矩阵
  2. [整合] 解决 Dell T640 安装显卡后风扇转速不降低
  3. 使用批处理复制并以时间规则重命名文件
  4. 服务 托管型呼叫中心的核心竞争力
  5. 获取json格式字符串的简单方法
  6. 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
  7. 寻找两个字符串相似度的代码
  8. /etc/rc.d/rc.sysinit 分析
  9. mybatis调用存储过程
  10. Java面向对象 第3节 类的封装和继承