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

利用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开发--多线程下载加断点续传

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

    MulThreadDownload:HTTP协议实现断点续传下载

    MulThreadDownloadHTTP协议实现断点续传下载代码原文来自:利用RandomAccessFile类实现多线程下载,另一种做法在

    Java案例开发锦集

    案例5 字符串的查找与替换 案例6 利用RandomAccessFile类来实现文件追加 案例7 用Zip进行多文件保存 案例8 用JUNIT建立测试类 案例9 用Java保存位图文件 案例10 获取文件属性 第六章 Java与...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量...

    疯狂JAVA讲义

    5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 ...

    Java开发技术大全 电子版

    第8章Java的多线程机制266 8.1线程的概念266 8.1.1多线程的特点266 8.1.2线程的状态267 8.2Thread类268 8.2.1Thread类的构造方法268 8.2.2Thread类的常用方法268 8.3多线程程序的编写269 8.3.1利用Thread的...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    12.1.3实现Runnable接口开发多线程 12.1.4两种方法有何区别 12.2控制线程运行 12.2.1为什么要控制线程运行 12.2.2传统方法的安全问题 12.2.3如何控制线程的运行 12.3线程同步安全 12.3.1什么是线程同步 ...

    AIC的Java课程1-6章

     理解和应用Java异常,常用类,IO,集合和多线程等开发技术。  课时安排  总学时:52学时  授课:48学时 (含约20学时实验)  考试:4学时  预备知识  了解和使用操作系统,...

    Think in Java(中文版)chm格式

    14.1.2 针对用户界面的多线程 14.1.3 用主类合并线程 14.1.4 制作多个线程 14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 ...

    JAVA_Thinking in Java

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    Java初学者入门教学

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    ThinkInJava

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    java 编程入门思考

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    thinkinjava

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    Thinking in Java简体中文(全)

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    java联想(中文)

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

Global site tag (gtag.js) - Google Analytics