Java多线程下载文件
发布时间:2020-12-14 23:38:29 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MultiThreadDownFile { public static void main(String[] args) { try { String filePath = "http://dl_dir.qq.com/qqfile/qd/QQ2012Beta3_QQProtect2.8.exe"; int threadNum = 5; new MultiThreadDown().down(filePath,threadNum); } catch (Exception e) { e.printStackTrace(); } } } class MultiThreadDown extends Thread { private int threadId; private int block; private URL url; private File file; public MultiThreadDown() { } public MultiThreadDown(int threadId,int block,URL url,File file) { super(); this.threadId = threadId; this.block = block; this.url = url; this.file = file; } public void down(String path,int threadNum) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); try { if (conn.getResponseCode() == 200) { int fileLength = conn.getContentLength();// Get the length of // NetFile System.out.println("网络文件大小:" + fileLength); File file = new File(getFilename(path)); RandomAccessFile raf = new RandomAccessFile(file,"rwd"); raf.setLength(fileLength); raf.close(); // 计算每条线程的下载量 int block = fileLength % threadNum == 0 ? fileLength / threadNum : fileLength / threadNum + 1; for (int threadId = 0; threadId < threadNum; threadId++) { new MultiThreadDown(threadId,block,url,file).start(); System.out.println("线程" + threadId + "开始"); } } else { System.out.println("Connection failed."); } } catch (Exception e) { System.out.println("连接失败."); e.printStackTrace(); } } private String getFilename(String path) { return path.substring(path.lastIndexOf("/") + 1); } @Override public void run() { super.run(); int start = threadId * block;// 计算线程下载的网络文件的文件位置 int end = (threadId + 1) * block - 1;// 线程的结束位置 try { RandomAccessFile raf = new RandomAccessFile(file,"rwd"); raf.seek(start); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); conn.setRequestProperty("Range","bytes=" + start + "-" + end); if (conn.getResponseCode() == 206) { InputStream is = conn.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while ((len = is.read(buf)) != -1) { raf.write(buf,len); } raf.close(); is.close(); } System.out.println("第" + threadId + "线程下载完毕"); } catch (Exception e) { e.printStackTrace(); } } } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |