多线程从网络下载文件

主类:

 1 public class DownThreadDemo {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         int threadNum = 3;
 6         long fileLen = 0;
 7         long numPerThread = 0;
 8         long left = 0;
 9         URL url = null;
10         URLConnection connection = null;
11         String fileName = "e:\\temp\\downlo.jpg";
12         RandomAccessFile[] raf = new RandomAccessFile[threadNum];
13         InputStream[] is = new InputStream[threadNum];
14         try {
15             url = new URL(
16                     "http://img.bizhi.sogou.com/images/2014/08/22/830201.jpg");
17             // 打开网路连接
18             connection = url.openConnection();
19             // 计算文件大小
20             fileLen = connection.getContentLengthLong();
21             // 每个线程处理的文件大小
22             numPerThread = fileLen / threadNum;
23             // 最后一块
24             left = fileLen % threadNum;
25             // openConnection().getInputStream()
26             is[0] = url.openStream();
27             raf[0] = new RandomAccessFile(fileName, "rw");
28             raf[0].setLength(fileLen);
29             // 分别为每个线程创建一个从网络读取的流与写入文件的流。
30             for (int i = 0; i < threadNum; i++) {
31                 if (i != 0) {
32                     is[i] = url.openStream();
33                     raf[i] = new RandomAccessFile(fileName, "rw");
34                 }
35                 if (i == threadNum - 1) {
36                     new MultyDown(i * numPerThread, (i + 1) * numPerThread
37                             + left, is[i], raf[i]).start();
38                 } else {
39                     new MultyDown(i * numPerThread, (i + 1) * numPerThread,
40                             is[i], raf[i]).start();
41                 }
42             }
43         } catch (MalformedURLException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         } catch (IOException e) {
47             // TODO Auto-generated catch block
48             e.printStackTrace();
49         }
50         System.out.println("end------");
51     }
52
53 }

线程类:

 1 public class MultyDown extends Thread {
 2     private long start, end;
 3     private InputStream is;
 4     private RandomAccessFile raf;
 5
 6     public MultyDown() {
 7         // TODO Auto-generated constructor stub
 8     }
 9
10     public MultyDown(long start, long end, InputStream is, RandomAccessFile raf) {
11         // TODO Auto-generated constructor stub
12         this.start = start;
13         this.end = end;
14         this.is = is;
15         this.raf = raf;
16     }
17
18     @Override
19     public void run() {
20         // TODO Auto-generated method stub
21
22         int len = 0;
23         int size = 0;
24         byte[] b = new byte[24];
25         try {
26             // 跳到文件指定位置
27             is.skip(start);
28             raf.seek(start);
29             while ((len = is.read(b)) != -1 && size < (end - start)) {
30                 raf.write(b, 0, len);
31                 size += len;
32             }
33         } catch (IOException e) {
34             // TODO Auto-generated catch block
35             e.printStackTrace();
36         } finally {
37             if (is != null) {
38                 try {
39                     is.close();
40                 } catch (IOException e) {
41                     // TODO Auto-generated catch block
42                     e.printStackTrace();
43                 }
44             }
45             if (raf != null) {
46                 try {
47                     raf.close();
48                 } catch (IOException e) {
49                     // TODO Auto-generated catch block
50                     e.printStackTrace();
51                 }
52             }
53         }
54     }
55
56 }
时间: 2024-10-27 18:40:05

多线程从网络下载文件的相关文章

sharepoint 2007 “文件为网络下载文件,请存储到硬盘之后再修改文件。”

当直接打开sharepoint 2007 上的excel文档后,使用使用ctrl+s保存的时候,就弹出对话框"文件为网络下载文件,请存储到硬盘之后再修改文件." 检查发现是sharepoint上安装了第三方加密工具trustview导致的. 解决办法:1.点击保存按钮保存 2.使用"迁出"后,打开文档 3.在excel中关闭trustview插件: excel options--add-ins--mamage下面选择com add-ins--然后点Go--取消选择:

iOS开发网络多线程之网络请求文件解析

一.网络请求 1. get请求 1> 确定URL 2> 创建请求 3> 发送连接请求(网络请求用异步函数) - (void)get {    // 1.url    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];        // 2.请求    NSURLRequest *reque

网络下载文件

/** * 从网络Url中下载文件 * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{ URL url = new URL(urlStr); HttpURLConnection conn = (

iOS如何阅览和选择应用打开网络下载的pdf、word、jpg、MP4等文件

通过创建UIDocumentInteractionController来实现这一功能,如下栗子: #pragma mark - 展示文件 - (void)showDownloadFile:(NSString *)fileName{ // 从沙盒中获取(以下路径是我从网络下载文件存放的路径) NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) fir

java多线程下载文件和断点下载

多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile;

android命令模式IntentService 远程下载文件

服务可用在一下情景: 1,用户离开activity后,仍需要继续工作,例如从网络下载文件,播放音乐. 2,无论activity出现或离开,都需要持续工作,例如网络聊天应用. 3,连接网络服务,正在使用一个远程API提供的服务. 4,定时触发的任务 1.因为IntentService是Service子类,所以也需要在manifest中声明服务 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns

[iOS 多线程 &amp; 网络 - 2.10] - ASI框架下载文件

A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的网络请求(异步).按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间. ASI框架是基于底层的cfnoteworking的,性能很好.当然也可以设置block,或者是监听下载的进度. 自动会使用“边下边写” 使用进度

ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void)MIMEType { //    NSString *file = @"file:///Users/文顶顶/Desktop/test.png"; [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[

Android 多线程断点续传同时下载多个大文件

最近学习在Android环境中一些网络请求方面的知识,其中有一部分是关于网络下载方面的知识.在这里解析一下自己写的demo,总结一下自己所学的知识.下图为demo的效果图,仿照一些应用下载商城在ListView中列出加载项,然后可以可以下载和停止. 1.概述 这里有几个比较重要的类DownloadManager.DownloadService.DownloadTask.ThreadDAOImpl.主要的下载流程如下. (1) DownloadManager 负责下载任务的调配,以及下载服务Dow