java多线程下载
来源:互联网 发布:netflix知乎 编辑:程序博客网 时间:2024/06/05 01:08
/*
* java 多线程下载
*/
package com.wangweijun.downloadersercie;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.Environment;
import android.util.Log;
public class MulThreadDownloaderService {
/*
* urlStr 资源地址
*/
public void mulThreadDownloader(String urlStr) throws Exception{
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// 由链接对象来获取文件大小
int fileSize = conn.getContentLength();
conn.disconnect();
//File file = new File("wang.mp3");
//本来还要帮段Sdcard 的状态
File file = new File(Environment.getExternalStorageDirectory(), "wang.mp3");
// 创建本地随机访问文件,
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
randomAccessFile.setLength(fileSize);
randomAccessFile.close();
//线程数目
int threadNum = 3;
int threadFileSize = fileSize / threadNum + 1;
for (int i = 0; i < threadNum; i++) {
RandomAccessFile threadFile = new RandomAccessFile(file, "rw");
// 设置本地文件开始写入位置
int startPosition = i * threadFileSize;
//RandomAccessFile 这个类的好处就是可以设置file 的切点
//就是说你可以在任意位置读取或写入 data
threadFile.seek(startPosition);
ThreadLoader tl = new ThreadLoader(url, startPosition, threadFile, threadFileSize, i+1);
tl.start();
}
}
private class ThreadLoader extends Thread{
private int startPosition;
private RandomAccessFile threadFile;
private int threadFileSize;
private int threadId;
private URL url;
public ThreadLoader(URL url , int startPosition,
RandomAccessFile threadFile, int threadFileSize, int threadId) {
this.startPosition = startPosition;
this.threadFile = threadFile;
this.threadFileSize = threadFileSize;
this.threadId = threadId;
this.url = url;
}
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// 设置远程文件的开始读入文件
conn.setRequestProperty("Range", "bytes=" + startPosition + "-");
InputStream inputStream = conn.getInputStream();
byte buffer[] = new byte[1024];
int location = -1;
int totalSize = 0;
while(totalSize <threadFileSize && (location = inputStream.read(buffer)) != -1){
threadFile.write(buffer, 0, location);
totalSize = totalSize + location;
}
threadFile.close();
inputStream.close();
conn.disconnect();
Log.i("ThreadLoader", threadId +" 线程下载完毕");
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("MalformedURLException()");
} catch (IOException e) {
e.printStackTrace();
System.out.println("IOException()");
}
}
}
}
源码参考传智播客黎活明老师的3g视频
- java 多线程下载
- java 多线程断点下载
- Java多线程下载
- java多线程下载
- java多线程下载
- Java多线程下载
- java多线程下载
- Java多线程下载
- java多线程下载程序
- Java多线程下载文件
- java多线程下载文件
- java实现多线程下载
- Java多线程下载
- Java多线程下载文件
- java多线程下载
- Java多线程下载文件
- Java多线程下载文件
- Java多线程下载代码
- 如何开展灰盒测试[1]:灰盒测试优缺点分析 收藏 此文于2010-12-01被推荐到CSDN首页
- 窗体靠紧屏幕边时自动隐藏的代码
- opencv [c++版] 学习笔记(2) 在MFC基于对话框界面上播放视频
- 程序员面试题精选(01)-把二元查找树转变成排序的双向链表
- 很好很强大,留着漫漫看。尤其是在烦闷的时候看
- java多线程下载
- Python cPickle模块
- DWR(Direct Web Remoting)
- 快速排序
- Python获取校内好友信息
- 常用正则表达式
- VIM上的插件(摘自网络)
- 无焦点窗口ToolStripButton1点击问题
- 让PowerPoint转成Flash格式