`
lohasle
  • 浏览: 254768 次
社区版块
存档分类
最新评论

利用RandomAccessFile 实现多线程下载。

    博客分类:
  • i/o
阅读更多
没事写个 多线程下载的例子,虽然项目中下载没用到
我想知道,如果使用了多线程下载,当多用户同时对这一个资源进行下载的时候会怎么样。有木有这样的文推荐。这是个随手写的程序,如果问题,希望讨论下。
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);
	}
}







分享到:
评论
1 楼 乛小小白 2018-03-02  
有问题啊,下载下来的东西后面有一堆重复的

相关推荐

    android多线程下载.pdf

    本文采用的是第二种方法,即利用RandomAccessFile实现多线程下载。首先,我们需要创建一个继承自Thread的子类,例如`FileDownloadThread`。这个线程类包含了下载所需的URL、目标文件、起始位置和结束位置等信息。在...

    android 实现多线程下载。

    在Android平台上实现多线程下载是一项常见的任务,尤其在处理大文件时,为了提高下载速度和用户体验,通常会采用多线程技术。本教程将详细解释如何在Android中实现这一功能。 首先,我们需要理解多线程下载的基本...

    Android中多线程下载原理实现案例

    在Android中,我们可以使用`AsyncTask`、`Handler`、`Looper`以及`ThreadPoolExecutor`等组件来实现多线程下载。`AsyncTask`适用于轻量级的异步任务,但对大量并发操作可能不够高效。因此,更推荐使用`...

    Java多线程文件分片下载实现的示例代码

    这样可以实现多线程下载和本地写入。 多线程文件分片下载的实现 ----------------------------- 下面是一个多线程文件分片下载的示例代码: public class UnitDownloader implements Runnable { private int ...

    Android多线程文件夹下载及断点续传

    在实现多线程下载和断点续传时,还需要注意以下几点: - **异常处理**:网络中断、文件I/O错误等异常情况需要妥善处理,确保能够恢复下载。 - **线程同步**:在多线程环境下,需要确保线程安全,防止数据竞争和不...

    java多线程下载源代码

    在Java中实现多线程下载,主要涉及到以下几个核心知识点: 1. **线程基础**:首先,你需要了解Java中的`Thread`类或实现`Runnable`接口来创建和管理线程。每个线程负责下载文件的一个部分。 2. **文件分块**:在...

    Android多线程下载

    8. **下载库的使用**: 实现多线程下载功能需要考虑很多细节,因此开发者经常选择使用成熟的下载库,如Volley、OkHttp、Android-Async-Http等,它们已经内置了多线程下载、断点续传等功能,可以简化开发过程。...

    java 多线程下载和断点续传

    为了实现多线程下载,首先需要将文件切分成多个部分,每个部分由一个单独的线程负责下载。在这个例子中,文件被平均切分成`tn`份,每一份大约`len`字节长。最后一份可能稍长一些,因为它包含了剩余的部分。 ##### ...

    基于java开发的多线程下载工具(源码)

    《基于Java开发的多线程下载工具》 在IT领域,高效的文件下载是不可或缺的一环,尤其是对于大文件,多线程下载技术可以显著提升下载速度。本项目是一款基于Java语言开发的多线程下载工具,它实现了HTTP和FTP协议的...

    java多线程下载文件

    本文将深入解析Java多线程下载文件的关键技术和实现细节。 #### 一、Java多线程下载原理 多线程下载的核心思想是将一个大文件分割成多个小的部分,每个部分由一个独立的线程进行下载,最后将这些部分合并成完整的...

    java Swing 多线程下载器

    在Java Swing中实现多线程下载,我们需要利用Java的并发特性。多线程允许我们同时处理多个任务,对于下载来说,这意味着我们可以将一个大文件分割成多个小部分,然后在不同的线程中并行下载这些部分。这极大地提高了...

    使用URL和URLConnection(多线程下载)

    本文将详细介绍如何使用Java中的`URL`和`URLConnection`类来实现多线程下载,同时深入解析其中涉及的关键概念和技术细节。 #### 一、URL与URLConnection简介 `URL`(Uniform Resource Locator)是统一资源定位符的...

    Java 多线程下载

    这个压缩包文件"UpdateDownload"可能包含了一个实现多线程下载功能的Java项目。下面将详细介绍多线程下载的概念、原理以及Java中实现多线程下载的方法。 **多线程下载概念:** 多线程下载是指通过创建多个并发的...

    java多线程下载工具,仿照迅雷

    4. **分块下载**:为了实现多线程下载,需要将大文件分割成多个小块,每个线程负责下载一个块。这涉及到文件的逻辑分块和物理存储。Java中可以通过`RandomAccessFile`类来操作文件的任意位置进行读写。 5. **同步和...

    Android文件下载(实现断点续传)

    3. 启动多线程下载:创建一个线程池,每个线程负责下载文件的一部分。线程内部,根据下载进度(已下载的字节数)计算出开始下载的位置,并设置为RandomAccessFile的当前位置。 4. 发送HTTP请求:向服务器请求数据,...

    Android开发--多线程下载加断点续传

    1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位置是i * range到(i + 1) * rang - 1,注意最后一段的位置是到filesize - 1; ...

    多线程 断点续传 下载

    多线程下载文件时,通常会将大文件分割成若干小块,每个线程负责下载一块,这样可以充分利用系统资源,提高下载速度。Java提供了丰富的API来控制线程的同步与通信,如`synchronized`关键字、`wait()`、`notify()`和`...

    DownloadThread.zip_ DownloadThread_DownloadThread_Java 多线程 下载_ja

    4. `java多线程下载程序.txt`和`用Java设计下载软件.txt`:这两个文本文件可能是项目文档,包含了关于如何设计和实现多线程下载程序的详细说明,包括设计理念、实现方法以及可能遇到的问题和解决方案。 在Java中...

Global site tag (gtag.js) - Google Analytics