没事写个 多线程下载的例子,虽然项目中下载没用到
。
我想知道,如果使用了多线程下载,当多用户同时对这一个资源进行下载的时候会怎么样。有木有这样的文推荐。这是个随手写的程序,如果问题,希望讨论下。
class --MyMutilDown
public class MyMutilDown {
/**
* 单线程的远程下载
*/
public void testOneTDown(String filePath, String url) {
try {
// 要写入的文件
File file = new File(filePath + getFileExtName(url));
FileWriter fWriter = new FileWriter(file);
URL ul = new URL(url);
URLConnection conn = ul.openConnection();
conn.setConnectTimeout(2000);// 请求超时时间
// int len = conn.getContentLength();
InputStream in = conn.getInputStream();
// byte[] by = new byte[1024];
int temp = 0;
while ((temp = in.read()) != -1) {
fWriter.write(temp);
}
fWriter.close();
in.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 文件后缀名
*
* @param path
* @return
*/
public String getFileExtName(String path) {
return path.substring(path.lastIndexOf("."));
}
/**
* 测试多线程
*
* @param filePath
* 文件保存路径
* @param url
* url
* @param tnum
* 线程数量
*/
public void testMoreTDown(String filePath, String url, int tnum) {
try {
// 要写入的文件
final File file = new File(filePath + getFileExtName(url));
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");// 建立随机访问
final URL ul = new URL(url);
HttpURLConnection conn = (HttpURLConnection) ul.openConnection();
conn.setConnectTimeout(2000);// 请求超时时间
conn.setRequestMethod("GET");
int len = conn.getContentLength();// 文件长度
accessFile.setLength(len);
accessFile.close();
final int block = (len + tnum - 1) / tnum;// 每个线程下载的快大小
for (int i = 0; i < tnum; i++) {
final int a = i;
new Thread(new Runnable() {
int start = block * a;// 开始位置
int end = block * (a + 1) - 1;// 结束位置
@Override
public void run() {
HttpURLConnection conn2 = null;
RandomAccessFile accessFile2 = null;
InputStream in = null;
try {
conn2 = (HttpURLConnection) ul.openConnection();
conn2.setConnectTimeout(2000);// 请求超时时间
conn2.setRequestMethod("GET");
// TODO Auto-generated method stub
conn2.setRequestProperty("Range", "bytes=" + start
+ "-" + end + "");// 设置一般请求属性 范围
in = conn2.getInputStream();
byte[] data = new byte[1024];
int len = 0;
accessFile2 = new RandomAccessFile(file, "rwd");
accessFile2.seek(start);
while ((len = in.read(data)) != -1) {
accessFile2.write(data, 0, len);
}
System.out.println("线程:" + a + "下载完成!");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
try {
accessFile2.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
MyMutilDown mydown = new MyMutilDown();
String path = "http://static.ishare.down.sina.com.cn/5585234.txt?ssig=f7CrV3UL8%2B&Expires=1347724800&KID=sina,ishare&ip=1347592902,117.40.138.&fn=%E5%8E%9A%E9%BB%91%E5%AD%A6.TXT";
// mydown.downLoad(path, "D:\\aa", 1);
// mydown.testOneTDown("D:\\", path);
mydown.testMoreTDown("D:\\aa", path, 3);
}
}
分享到:
相关推荐
本文采用的是第二种方法,即利用RandomAccessFile实现多线程下载。首先,我们需要创建一个继承自Thread的子类,例如`FileDownloadThread`。这个线程类包含了下载所需的URL、目标文件、起始位置和结束位置等信息。在...
在Android平台上实现多线程下载是一项常见的任务,尤其在处理大文件时,为了提高下载速度和用户体验,通常会采用多线程技术。本教程将详细解释如何在Android中实现这一功能。 首先,我们需要理解多线程下载的基本...
在Android中,我们可以使用`AsyncTask`、`Handler`、`Looper`以及`ThreadPoolExecutor`等组件来实现多线程下载。`AsyncTask`适用于轻量级的异步任务,但对大量并发操作可能不够高效。因此,更推荐使用`...
这样可以实现多线程下载和本地写入。 多线程文件分片下载的实现 ----------------------------- 下面是一个多线程文件分片下载的示例代码: public class UnitDownloader implements Runnable { private int ...
在实现多线程下载和断点续传时,还需要注意以下几点: - **异常处理**:网络中断、文件I/O错误等异常情况需要妥善处理,确保能够恢复下载。 - **线程同步**:在多线程环境下,需要确保线程安全,防止数据竞争和不...
在Java中实现多线程下载,主要涉及到以下几个核心知识点: 1. **线程基础**:首先,你需要了解Java中的`Thread`类或实现`Runnable`接口来创建和管理线程。每个线程负责下载文件的一个部分。 2. **文件分块**:在...
8. **下载库的使用**: 实现多线程下载功能需要考虑很多细节,因此开发者经常选择使用成熟的下载库,如Volley、OkHttp、Android-Async-Http等,它们已经内置了多线程下载、断点续传等功能,可以简化开发过程。...
为了实现多线程下载,首先需要将文件切分成多个部分,每个部分由一个单独的线程负责下载。在这个例子中,文件被平均切分成`tn`份,每一份大约`len`字节长。最后一份可能稍长一些,因为它包含了剩余的部分。 ##### ...
《基于Java开发的多线程下载工具》 在IT领域,高效的文件下载是不可或缺的一环,尤其是对于大文件,多线程下载技术可以显著提升下载速度。本项目是一款基于Java语言开发的多线程下载工具,它实现了HTTP和FTP协议的...
本文将深入解析Java多线程下载文件的关键技术和实现细节。 #### 一、Java多线程下载原理 多线程下载的核心思想是将一个大文件分割成多个小的部分,每个部分由一个独立的线程进行下载,最后将这些部分合并成完整的...
在Java Swing中实现多线程下载,我们需要利用Java的并发特性。多线程允许我们同时处理多个任务,对于下载来说,这意味着我们可以将一个大文件分割成多个小部分,然后在不同的线程中并行下载这些部分。这极大地提高了...
本文将详细介绍如何使用Java中的`URL`和`URLConnection`类来实现多线程下载,同时深入解析其中涉及的关键概念和技术细节。 #### 一、URL与URLConnection简介 `URL`(Uniform Resource Locator)是统一资源定位符的...
这个压缩包文件"UpdateDownload"可能包含了一个实现多线程下载功能的Java项目。下面将详细介绍多线程下载的概念、原理以及Java中实现多线程下载的方法。 **多线程下载概念:** 多线程下载是指通过创建多个并发的...
4. **分块下载**:为了实现多线程下载,需要将大文件分割成多个小块,每个线程负责下载一个块。这涉及到文件的逻辑分块和物理存储。Java中可以通过`RandomAccessFile`类来操作文件的任意位置进行读写。 5. **同步和...
3. 启动多线程下载:创建一个线程池,每个线程负责下载文件的一部分。线程内部,根据下载进度(已下载的字节数)计算出开始下载的位置,并设置为RandomAccessFile的当前位置。 4. 发送HTTP请求:向服务器请求数据,...
1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位置是i * range到(i + 1) * rang - 1,注意最后一段的位置是到filesize - 1; ...
多线程下载文件时,通常会将大文件分割成若干小块,每个线程负责下载一块,这样可以充分利用系统资源,提高下载速度。Java提供了丰富的API来控制线程的同步与通信,如`synchronized`关键字、`wait()`、`notify()`和`...
4. `java多线程下载程序.txt`和`用Java设计下载软件.txt`:这两个文本文件可能是项目文档,包含了关于如何设计和实现多线程下载程序的详细说明,包括设计理念、实现方法以及可能遇到的问题和解决方案。 在Java中...