上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用java语言写了一个断点续传的小程序来分享给大家,
首先要下载个用于网络请求的框架:我这里给出地址,是用的Apache的HttpClient:传送门 解压出来有这些jar文件,我用红框标记的是本次需要使用的
这个小程序是没有界面的一个小程序,在概就是和下图一样的了,有一个展示磁盘信息的界面,这个界面不是图型化的哈
声名:这个小程序因为是在闲置时间写的所以没有细致的写程序,只是为了实现功能能, 觉得有用的可以看下,觉得对自己没有帮助的可以略过,不喜勿喷哈
好了,开始写代码吧:
创建项目这里就不用说了哈 首先要显示如上的界面,这个是展示磁盘信息的一个界面
1 /** 2 * 初始化硬盘 3 */ 4 private void initDiskInfo() { 5 System.out.println("\t\t\t磁盘信息展示"); 6 FileSystemView fsv = FileSystemView.getFileSystemView(); // 获取文件系统的视图 7 File[] fs = File.listRoots(); // 获取到根目录 8 System.out.println("==================================================="); 9 System.out.println("磁盘名称\t\t磁盘总容量\t\t磁盘剩余容量"); 10 System.out.println("==================================================="); 11 for (File f : fs) { 12 System.out.println(fsv.getSystemDisplayName(f) + "\t\t" + FormaetFileSize(f.getTotalSpace()) + "\t\t\t" 13 + FormaetFileSize(f.getFreeSpace())); 14 System.out.println("==================================================="); 15 } 16 }
上面的代码里面调用的一个格式化字节数的一个FormaetFileSize方法,代码里面有写注释,在家可以看下
1 /** 2 * 计算磁盘容量 3 * @param fileS 传入的磁盘字节大小 4 * @return 5 */ 6 private String FormaetFileSize(long fileS) { 7 //这里使用的是DecimalFormat来做的格式化处理,如果感兴趣的可以自百度下,因为这个我在做程序的时候也是自已现百度的 8 DecimalFormat dFormat = new DecimalFormat("#.00"); 9 String fileSize = ""; 10 if (fileS < 1024) { 11 fileSize = dFormat.format((double) fileS) + "B"; 12 } else if (fileS < 1048576) { 13 fileSize = dFormat.format((double) fileS / 1024) + "K"; 14 } else if (fileS < 1073741824) { 15 fileSize = dFormat.format((double) fileS / 1048576) + "M"; 16 } else { 17 fileSize = dFormat.format((double) fileS / 1073741824) + "G"; 18 } 19 return fileSize; 20 }
main方法的启动方法
1 public static void main(String[] args) { 2 RunStart runStart = new RunStart(); 3 //展示硬盘磁盘信息 4 runStart.initDiskInfo(); 5 System.out.print("请输入要写入文件的磁盘:"); 6 Scanner scanner = new Scanner(System.in); 7 String diskName = scanner.next(); 8 System.out.print("请输入要写入文件的路径(例如:download/):"); 9 String pathName = scanner.next(); 10 System.out.print("请输入文件名"); 11 String fileNameString = scanner.next(); 12 System.out.print("请输入文件的URL地址:"); 13 String urlString = scanner.next(); 14 System.out.println("===="+diskName +":"+File.separatorChar +pathName); 15 new Thread(new FileDowload(urlString,diskName,pathName,fileNameString)).start(); 16 17 }
进行下载文件的时候我是创建了一个子线程来进行处理的,这里需要创建一个类,实现Runnable接口,为什么不使用Thread,因为我习惯使用Runnable接口,我给这个类取了一个
FileDowload的名字。
FileDowload的构造函数,构造的参数已写明
1 /** 2 * 3 * @param urlPath 网络文件的url 4 * @param panFlag 需要写入磁盘的盘符 5 * @param panS 保存文件的路径 6 * @param fileName 保存的文件名 7 */ 8 public FileDowload(String urlPath, String panFlag,String panS,String fileName) { 9 this.urlPath = urlPath; 10 this.PanFlag = panFlag; 11 this.downloadPath = panS; 12 this.fileName_Disk = fileName; 13 System.out.println("URL:" + urlPath + "\n" + "盘符:"+panFlag+"\n"+"路径:" + panS +"\n文件名:"+fileName); 14 }
判断磁盘空间是否满足
1 /** 2 * 判断磁盘容量是否满足 3 * @throws IOException 4 * @throws ClientProtocolException 5 */ 6 private boolean panDiskSize() throws ClientProtocolException, IOException { 7 //getFreeSpace是获取到磁盘的剩余空间 8 File file =new File(PanFlag + ":"); 9 System.out.println(file.getFreeSpace()); 10 HttpClient client = HttpClients.createDefault(); 11 HttpGet httpGet = new HttpGet(urlPath); 12 HttpResponse response = client.execute(httpGet); 13 HttpEntity entity = response.getEntity(); 14 long fileSize = entity.getContentLength(); 15 fileESize = fileSize; //将文件的大小赋值给全局量,以在panDiskConnect方法中判断文件完整性 16 //关闭连接,谁知道能不能用,官方没有找到关闭链接的方法,先来一套 17 client.getConnectionManager().shutdown(); 18 if(file.getFreeSpace() > fileSize) { 19 System.out.println("磁盘容量满足"); 20 return true; 21 } 22 return false; 23 }
如果文件不存在,将进行首次下载
1 /** 2 * 开始普通下载 3 */ 4 private void startDownloadFile() { 5 System.out.println("进入下载的url" + urlPath); 6 try { 7 HttpClient client = HttpClients.createDefault(); 8 9 HttpGet get = new HttpGet(urlPath); 10 HttpResponse response = client.execute(get); 11 HttpEntity entity = response.getEntity(); 12 InputStream iStream = entity.getContent(); 13 OutputStream oStream = new FileOutputStream(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk); 14 int len = -1; 15 int p = 0; 16 byte[] temp = new byte[5120]; 17 while ((len = iStream.read(temp)) !=-1) { 18 oStream.write(temp,0,len); 19 p = p +len; 20 System.out.println("字节跳动==>"+p); 21 } 22 oStream.flush(); 23 oStream.close(); 24 iStream.close(); 25 client.getConnectionManager().shutdown(); 26 } catch (ClientProtocolException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 34 }
文件未下载完,进行断点续传
1 /** 2 * 断点续传方法 3 */ 4 private void posDownload(File file) { 5 //获取现有文件的字节 6 long fileLength = file.length(); 7 System.out.println("现有字节数:" + fileLength); 8 try { 9 HttpClient client = HttpClients.createDefault(); 10 HttpGet get = new HttpGet(urlPath); 11 get.setHeader("Accept-Ranges","bytes"); 12 get.setHeader("Range", " bytes="+fileLength+"-"); 13 HttpResponse response = client.execute(get); 14 HttpEntity entity = response.getEntity(); 15 InputStream iStream = entity.getContent(); 16 //iStream.skip(fileLength); 17 OutputStream oStream = new FileOutputStream(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk,true); 18 int len = -1; 19 int p = 0; 20 byte[] temp = new byte[5120]; 21 while ((len = iStream.read(temp)) !=-1) { 22 oStream.write(temp,0,len); 23 p = p +len; 24 System.out.println("字节跳动==>"+p); 25 } 26 oStream.flush(); 27 oStream.close(); 28 iStream.close(); 29 client.getConnectionManager().shutdown(); 30 } catch (ClientProtocolException e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 38 }
判断磁盘是否存在
1 /** 2 * 判断用户输入的磁盘是否存在 3 */ 4 private void panDiskConnect() { 5 File fileisE = new File(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk); 6 File[] fs = File.listRoots(); 7 //将磁盘列表加入LISt集合 8 for (File file : fs) { 9 panS.add(file.toString().split(":")[0]); 10 } 11 //判断磁盘是否存在 12 if(panS.contains(PanFlag)) { 13 try { 14 //判断磁盘容量是否充足 15 if(panDiskSize()) { 16 //判断文件是否存在 17 if(fileisE.isFile()) { 18 System.out.println("文件长度"+fileESize); 19 //判断文件是否下载完整,因为懒所以没有使用md5验证了 20 if(fileisE.length() == fileESize) { 21 //如果下载完整就退出 22 System.out.println("文件已经的完整的了"); 23 return; 24 }else { 25 //断点续传 26 posDownload(fileisE); 27 } 28 29 }else { 30 //文件不存在的普通直接下载 31 startDownloadFile(); 32 } 33 } 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 }else { 38 System.out.println("您输入的磁盘盘符不存在"); 39 return; 40 } 41 } 42
这个类需要用的全局变量
1 private String urlPath = ""; 2 private String PanFlag = ""; 3 private String downloadPath = ""; 4 private String fileName_Disk = ""; 5 long fileESize = -1; 6 ListpanS = new ArrayList ();
run方法
1 @Override 2 public void run() { 3 panDiskConnect(); 4 }
上面的代码可能会有些乱,在家可以去我的csdn下载:传送门 今天上传文件的时候不知道怎么回事找不到修改积分的地方了,如果大家有积分希望支持下,如果没有积分大家在下方评论处留自已的邮箱我发送给大家。