网络多线线程下载示例

网络多线线程下载:

IO流与多线程应用示例

  1 import priv.gdw.utils.FileUtils;
  2 import java.io.*;
  3 import java.net.URL;
  4 import java.net.URLConnection;
  5
  6 /**
  7  * Created by kong on 07/11/2017.
  8  */
  9
 10 public class Test02 {
 11
 12     public static void main(String[] args) throws IOException {
 13         multithreadedDownload ("http://localhost:8080/image/a.jpg","/Users/Shared/abc",3);
 14     }
 15
 16     /**
 17      * 多线程下载,仅适用于Http协议
 18      *
 19      * @param srcPath  下载源文件路径名
 20      * @param destPath 保存文件夹路径名
 21      * @param count    指定线程个数
 22      */
 23     public static void multithreadedDownload(String srcPath, String destPath, int count) throws IOException {
 24
 25         //定义一个文件下载的文件夹路径
 26         File dir = new File (destPath);
 27         if (!dir.exists ()) {
 28             dir.mkdirs ();
 29         }
 30
 31         long total = getFileLength (srcPath);
 32         OpenMultithreadedDownload (srcPath, dir, total, count);
 33
 34         //判断线程的数量,如果只剩下一个,说明其他线程已经下载完成了
 35         while (Thread.activeCount () != 1) {
 36             try {
 37                 Thread.sleep (10);
 38             } catch (InterruptedException e) {
 39                 e.printStackTrace ();
 40             }
 41         }
 42         //获取文件的后缀名
 43         String suffix = srcPath.substring (srcPath.lastIndexOf ("."));
 44         //合并文件
 45         FileUtils.merge (dir, suffix);
 46
 47         System.out.println ("文件下载完成");
 48     }
 49
 50     /**
 51      * @param count 指定线程个数
 52      */
 53     private static void OpenMultithreadedDownload(String path, File dir, long total, int count) {
 54
 55         //计算出每个线程平均现在的字节个数
 56         long size = total / count;
 57         //使用循环,计算每个线程下载开始和结束位置
 58         for (int i = 1; i <= count; i++) {
 59             //开始位置
 60             long starIndex = (i - 1) * size;
 61             //结束位置
 62             long endIndex = i * size - 1;
 63             //最后一个线程
 64             if (i == count) {
 65                 endIndex = total - 1;
 66             }
 67             DownloadThread dt = new DownloadThread (path, dir, starIndex, endIndex, i);
 68             dt.start ();
 69         }
 70     }
 71
 72     //获取到服务器上的文件大小
 73     public static long getFileLength(String path) throws IOException {
 74
 75         URL url = new URL (path);
 76         //获得连接对象
 77         URLConnection con = url.openConnection ();
 78         long total = con.getContentLengthLong ();
 79         return total;
 80     }
 81 }
 82
 83
 84 class DownloadThread extends Thread {
 85
 86     private final String path;
 87     private final File dir;
 88     private final long startIndex;
 89     private final long endIndex;
 90     private final int threadID;
 91
 92     public DownloadThread(String path, File dir, long startIndex,
 93                           long endIndex, int threadID) {
 94         this.path = path;
 95         this.dir = dir;
 96         this.startIndex = startIndex;
 97         this.endIndex = endIndex;
 98         this.threadID = threadID;
 99     }
100     @Override
101     public void run() {
102         try {
103             InputStream in = getInputStream ();
104             FileOutputStream fos = getFileOutputStream ();
105             int len ;
106             byte[] arr = new byte[8192];
107             while ((len = in.read (arr)) != -1){
108                 fos.write (arr,0,len);
109             }
110             in.close ();
111             fos.close ();
112         } catch (Exception e) {
113             e.printStackTrace ();
114         }
115
116     }
117     //获取下载输出流
118     private FileOutputStream getFileOutputStream() throws FileNotFoundException {
119         //获取到文件的名字
120         int index = path.lastIndexOf ("/")+1;
121         String name = path.substring (index);
122         File file = new File (dir,threadID+name);//创建目标文件键,防止文件覆盖
123         //创建一个输出流
124         return new FileOutputStream (file);
125     }
126     //获取下载的输入流
127     private InputStream getInputStream() throws IOException {
128         //创建一个URL对象
129         URL url= new URL (path);
130         //获取到连接对象
131         URLConnection con = url.openConnection ();
132         con.setRequestProperty ("Range","bytes="+startIndex+"-"+endIndex);
133         //获取到输入流
134         return con.getInputStream ();
135     }
136 }

合并文件功能块:

 1 package priv.gdw.utils;
 2
 3 import java.io.*;
 4
 5 public class FileUtils {
 6
 7     //合并文件功能
 8     public static void merge(File dir,String suffix) throws IOException {
 9
10         File[] files = dir.listFiles (FileUtils.getFileFilter (suffix,false));
11         FileOutputStream fos = getFileOutputStream (dir, files[0]);
12
13         for(File file : files){
14             FileInputStream fis = new FileInputStream (file);
15             int len;
16             byte[] buf = new byte[8192];
17             while ((len=fis.read (buf)) != -1){
18                 fos.write (buf,0,len);
19             }
20             fis.close ();
21             //把已经合并过的文件删除
22             file.delete ();
23         }
24         fos.close ();
25     }
26     //获取合并文件输出流
27     private static FileOutputStream getFileOutputStream(File dir, File file) throws FileNotFoundException {
28         File file1 = file;
29         String name = file1.getName ();
30         name = name.substring (1);
31         File destFile = new File (dir,name);
32         return new FileOutputStream (destFile);
33     }
34
35 }
时间: 2024-11-14 13:09:23

网络多线线程下载示例的相关文章

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传) 网络ios文件管理器attributespathurl 在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐.下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://blog.csdn.net/pjk1129/article/details/6575588中有具体的介绍,今天重点介绍如何实现,废话少说,开始

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

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

Android之——断点下载示例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46897641 在上一篇博文<Android之--多线程下载示例>中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能.多线程下载中,可以将下载这个耗时的操作放在子线程中执行,即不阻塞主线程,又符合Android开发的设计规范. 但是当下载的过程当中突然出现手机卡死,或者网络中断

iOS开发网络篇—多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl

[IOS_HTTP]ASIHTTPRequest下载示例(支持断点续传)

在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐.下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://www.cnblogs.com/webapplee/p/3784599.html 中有具体的介绍,今天重点介绍如何实现,废话少说,开始正文: 一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue   *que = [[ASINetworkQu

JAVA基础知识之网络编程——-网络基础(多线程下载,get,post)

本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web资源,URLDecode和URLEncode用来转换字符串. 本文会写两个例子来演示java网络编程的一些基本用法. 第一个例子,写一个程序用来模拟多线程下载. 本例中用到的技术有,多线程--多个线程同时读文件写文件,可以加快下载速度, 线程池--在本例中线程池不是必须,甚至是多余,只不过是为了演示

Android---53---多线程下载

使用HttpURLConnection HttpURLConnection继承自URLConnection,也可用于向指定的网站发送GET请求 POST请求. 方法: int getResponseCode (): 获取服务器的响应代码 String getResponseMessage (): 获取服务器的响应消息 String getResponseMethod (): 获取发送请求的方法 void setRequestMethod (): 设置发送请求的方法 多线程下载 步骤: 1.创建U

TreadAPP-使用线程下载文件

package main; /** * Created by lxj-pc on 2017/6/27. */public class TreadApp {//volatile 线程间共享变量 private static volatile boolean isExit=false;//static成员不能访问非static成员 public static void main(String[] args) { //下载一个文件 启动线程 ,线程池使用, //启动线程 下载文件 1.线程自己实现方法

网络编程和线程

一.网络 (1)Unix 和 liunx是网络处理最好的操作系统. (2)网络必须要有网卡才能进行网络的连接. (3)原来网络走线方式,上网和电话线进入终端后一根线连接入户,这根线连接到数据分离器,分为ADLS端口和电话,再接收回来时,进过分离器传输到终端判断一下进入各自的线路. 二.网络分为广域网.城域网.局域网 中国最大的网络是国家骨干网,中国移动.联通.电信,都是靠骨干网分下来的网速. 1.广域网,在骨干网上拥有独立的IP地址. 2.城域网,一个城市所有联网用户共用一个IP地址. 3.局域