package download.multithread; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import download.ui.GUI; public class DownloadFileThread extends Thread{ //网络文件地址 public String urlFile; //当前线程的开始下载点 private long startPos; //当前线程的结束下载点 private long endPos; //当前线程下载文件的完整路径及名字 private String currentFileTreadName; //当前是第几个线程 public int currentThread; //类构造函数 public DownloadFileThread(String urlFile,long startPos,long endPos, String currentFileThreadName,int currentThread){ this.urlFile = urlFile; this.startPos = startPos; this.endPos = endPos; this.currentFileTreadName = currentFileThreadName; this.currentThread = currentThread; } //判断文件是否存在 - 判断文件名:currentFileThreadName.tp private boolean fileExist(String pathAndFile){ return new File(pathAndFile).exists(); } //获取文件大小 private long fileSize(String pathAndFile){ return new File(pathAndFile).length(); } //重命名文件 - 下载完成 - 命名规则:currentFileThreadName private void fileRename(String fromName,String toName){ new File(fromName).renameTo(new File(toName)); } //线程启动调用的方法 public void run(){ GUI.showLog(this.currentThread + "号线程下载开始"); BufferedInputStream bis = null; RandomAccessFile raf = null; String paf = ""; long offset = 0; try { //获取与所需下载的网络上资源的连接 URLConnection con = new URL(urlFile).openConnection(); log(this.currentThread + "连接成功"); //计算该线程需要下载内容的大小 offset = this.endPos - this.startPos + 1; log(this.currentThread + "下载大小=" + offset); if(!this.fileExist(this.currentFileTreadName)){ // 判断临时文件的存在 paf = this.currentFileTreadName + ".tp"; long length = 0;// 已下载长度 if (this.fileExist(paf)) { length = this.fileSize(paf); raf = new RandomAccessFile(new File(paf), "rw"); //指定插入位置 raf.seek(length); //重新计算开始下载点 this.startPos = this.startPos + length; log(this.currentThread + "断点续传,已存在=" + length); }else{ //新建缓存文件 raf = new RandomAccessFile(new File(paf), "rw"); } // 开始下载资源 bis = new BufferedInputStream(con.getInputStream()); bis.skip(this.startPos); log(this.currentThread + "跳到开始下载点=" + startPos); int blength;// 缓存实际长度 int BUFF = 2048; byte bytes[] = new byte[BUFF]; log(this.currentThread + "length=" + length + "startPos=" + startPos + "&endPos=" + endPos); while (true) { // 下载至缓存 blength = bis.read(bytes); // log("下载至缓存,长度=" + blength + ", 先前已下载=" + length); // 缓存至文件 if ((length += blength) < offset) { // log("缓存至文件"); raf.write(bytes, 0, blength); } else { if(length==offset){ log(this.currentThread + "#1缓存至文件,最后输入长度=" + blength); raf.write(bytes, 0, blength); }else{ log(this.currentThread + "blenth=" + blength + "&length=" + length + "&offset=" + offset + "&BUFF=" + BUFF); log(this.currentThread + "#2缓存至文件,最后输入长度=" + (blength-(int)(length-offset))); raf.write(bytes, 0,blength-(int)(length-offset)); } break; } } log(this.currentThread + "下载结束,文件名=" + paf + ",文件长度=" + this.fileSize(paf)); }else{ log(this.currentThread + "该临时文件已下载"); } } catch (MalformedURLException e) { // TODO Auto-generated catch block // e.printStackTrace(); log(this.currentThread + "获取URL失败"); GUI.showLog(this.currentThread + "号线程下载出错了 ..."); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); log(this.currentThread + "获取连接或下载时异常"); GUI.showLog(this.currentThread + "号线程下载出错了 ..."); } finally{ if(bis!=null){ try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(raf!=null){ try { raf.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } log(this.currentThread + "输入输出流关闭"); //下载结束,判断临时文件大小 if(this.fileSize(paf)==offset){ log(this.currentThread + "重命名文件"); //重命名文件 this.fileRename(paf, this.currentFileTreadName); GUI.showLog(this.currentThread + "号线程下载完成"); }else{ //下载失败 log(this.currentThread + "下载失败"); GUI.showLog(this.currentThread + "号线程下载出错 ..."); } //更新在调度线程中的状态 GetFileDispatchThread.checkList[this.currentThread] = true; log(this.currentThread + "线程结束"); } /* * 日志 */ boolean showLog = false; public void log(String msg){ if(this.showLog)System.out.println(msg); } // /** // * @param args // */ // public static void main(String[] args) { // // TODO Auto-generated method stub // // //测试方法 - 下载URL文件的一段 // new DownloadFileThread("http://192.168.28.121/eclipse.rar", 50 , 200, "eclipse3", 3).start(); // // /* // * 下载结束,文件长度为0 // * // * 原因:判读长度前,关闭输入输出流 // */ //// System.out.println(new File("E:\\Workspace\\DowmloadURLFile\\eclipse2.tp").length()); // } }


snowing_for LV9
2024年11月25日
刘先生-OL LV13
2024年11月25日
刘孟飞 LV22
2024年6月21日
pangzhihui LV14
2023年12月14日
愚人劫 LV1
2023年5月30日
Xgcxgc LV1
2023年3月28日
xingxing1234 LV10
2023年3月22日
liuind
2023年3月17日
暂无贡献等级
MoonSight LV1
2022年7月1日
fantaohaofan LV2
2022年6月23日