package xiawenquan.com;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;/** * 多线程下载 * @author xiawenquan * */public class MyDownLoad { public static void main(String[] args) { String path = "http://gb.cri.cn/mmsource/images/2011/10/22/a817ae91a2bb48e59c40673a9694b5fb.jpg"; new MyDownLoad().download(path,3); } /** * 根据路径和线程数下载文件 * @param path * @param threadSize */ private void download(String path, int threadSize) { try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(60*1000); connection.setRequestMethod("GET"); if(connection.getResponseCode() == 200){ int fileLength = connection.getContentLength(); File file = new File(getFileNameByPath(path)); RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.setLength(fileLength); accessFile.close(); // 计算每条线程下载的数据量,如果不整除则加上1 int block = fileLength / threadSize == 0 ? fileLength / threadSize : fileLength / threadSize + 1; for(int threadid = 0; threadid < threadSize; threadid ++){ new DownLoad(threadid,block,url,file).start(); } }else{ System.out.println("下载失败!"); } } catch (Exception e) { e.printStackTrace(); } } /** * 根据路径获取文件名称 * @param path * @return */ private String getFileNameByPath(String path) { String fileName = path.substring(path.lastIndexOf("/" ) + 1); return fileName; } // 负责下载的线程类 private class DownLoad extends Thread{ private int threadid; private int block; private URL url; private File file; public DownLoad(int threadid, int block, URL url, File file) { this.threadid = threadid; this.block = block; this.url = url; this.file = file; } @Override public void run() { // TODO 这个run()是每个线程下载的代码 try { int start = threadid * block ; // 计算线程下载的开始位置 int end = (threadid + 1) * block - 1;// 计算线程下载的结束位置 RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.seek(start); // seek()是使每一条线程在本地文件file中的什么位置开始写入数据 // 然后每条线程去连网 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(60*1000); connection.setRequestMethod("GET"); connection.setRequestProperty("Range", "bytes=" + start + "-" + end ); if(connection.getResponseCode() == 206){ // 分段下载的返回码不是200,而是206 InputStream inputStream = connection.getInputStream(); // 获取网络返回来的数据,返回来的数据是每一条线程的下载的数据 byte buffer[] = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { accessFile.write(buffer, 0, len); } accessFile.close(); inputStream.close(); System.out.println("第" + (threadid + 1) + "条线程下载完成"); } } catch (Exception e) { e.printStackTrace(); } } }}?
详细解决方案
java android 多线程上载
热度:91 发布时间:2016-05-01 14:06:03.0
相关解决方案
- java 乱码 汉字是 ? 如何转换成汉字
- java web 登录次数限制,该如何解决
- java 工商银行网银支付 B2B的 都亟需什么,需要注意什么
- Java Applet程序从JDK6升级到7时遇到的有关问题
- java web 视频相干
- 请教一个关于链接后缀的有关问题(java web 应用)
- java 系统单点登录解决方案
- java.lang.NumberFormatException: For input string: "id"该如何处理
- java.lang.NoSuchMethodException: setId([Ljava.lang.String;)解决方法
- java 获取客户端IP解决办法
- JAVA 后台怎么获得前台页面FCKedit编辑器中的内容以及内容的样式
- java 正则化匹配有关问题
- java web 受阻
- java.lang.IllegalStateException: No output folder,该怎么解决
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess,该如何解决
- java 乱码有关问题 急求大神
- java EE错误如何解决阿,都是过了,没有能解决的!
- java 工程打包有关问题 多谢各位大神!多谢
- JAVA WEB导航条,该怎么处理
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password,该如何处理
- java 中Node 有关问题
- 关于 java 引述传递和值传递,你的知否
- 吐了,java Timer 终止不了。
- Java Web 学习中有关问题,请高手指教
- java web中的url地址小疑点。
- java web开发解决办法
- java.lang.NullPointerException解决方法
- 关于 java cast 有关问题,你明白不
- java ftp 下传和上载乱码有关问题
- java web项目上的一些文件