JAVA编写的断点续传小程序
2019-06-23 16:09
1486 查看
上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用java语言写了一个断点续传的小程序来分享给大家,
首先要下载个用于网络请求的框架:我这里给出地址,是用的Apache的HttpClient:传送门 解压出来有这些jar文件,我用红框标记的是本次需要使用的
/** * 初始化硬盘 */ private void initDiskInfo() { System.out.println("\t\t\t磁盘信息展示"); FileSystemView fsv = FileSystemView.getFileSystemView(); // 获取文件系统的视图 File[] fs = File.listRoots(); // 获取到根目录 System.out.println("==================================================="); System.out.println("磁盘名称\t\t磁盘总容量\t\t磁盘剩余容量"); System.out.println("==================================================="); for (File f : fs) { System.out.println(fsv.getSystemDisplayName(f) + "\t\t" + FormaetFileSize(f.getTotalSpace()) + "\t\t\t" + FormaetFileSize(f.getFreeSpace())); System.out.println("==================================================="); } }显示磁盘信息的代码 上面的代码里面调用的一个格式化字节数的一个FormaetFileSize方法,代码里面有写注释,在家可以看下
/** * 计算磁盘容量 * @param fileS 传入的磁盘字节大小 * @return */ private String FormaetFileSize(long fileS) { //这里使用的是DecimalFormat来做的格式化处理,如果感兴趣的可以自百度下,因为这个我在做程序的时候也是自已现百度的 DecimalFormat dFormat = new DecimalFormat("#.00"); String fileSize = ""; if (fileS < 1024) { fileSize = dFormat.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSize = dFormat.format((double) fileS / 1024) + "K"; } else if (fileS < 1073741824) { fileSize = dFormat.format((double) fileS / 1048576) + "M"; } else { fileSize = dFormat.format((double) fileS / 1073741824) + "G"; } return fileSize; }格式化字节数
main方法的启动方法
public static void main(String[] args) { RunStart runStart = new RunStart(); //展示硬盘磁盘信息 runStart.initDiskInfo(); System.out.print("请输入要写入文件的磁盘:"); Scanner scanner = new Scanner(System.in); String diskName = scanner.next(); System.out.print("请输入要写入文件的路径(例如:download/):"); String pathName = scanner.next(); System.out.print("请输入文件名"); String fileNameString = scanner.next(); System.out.print("请输入文件的URL地址:"); String urlString = scanner.next(); System.out.println("===="+diskName +":"+File.separatorChar +pathName); new Thread(new FileDowload(urlString,diskName,pathName,fileNameString)).start(); }Main方法
进行下载文件的时候我是创建了一个子线程来进行处理的,这里需要创建一个类,实现Runnable接口,为什么不使用Thread,因为我习惯使用Runnable接口,我给这个类取了一个
FileDowload的名字。
FileDowload的构造函数,构造的参数已写明
/** * * @param urlPath 网络文件的url * @param panFlag 需要写入磁盘的盘符 * @param panS 保存文件的路径 * @param fileName 保存的文件名 */ public FileDowload(String urlPath, String panFlag,String panS,String fileName) { this.urlPath = urlPath; this.PanFlag = panFlag; this.downloadPath = panS; this.fileName_Disk = fileName; System.out.println("URL:" + urlPath + "\n" + "盘符:"+panFlag+"\n"+"路径:" + panS +"\n文件名:"+fileName); }FileDowload构造函数
判断磁盘空间是否满足
/** * 判断磁盘容量是否满足 * @throws IOException * @throws ClientProtocolException */ private boolean panDiskSize() throws ClientProtocolException, IOException { //getFreeSpace是获取到磁盘的剩余空间 File file =new File(PanFlag + ":"); System.out.println(file.getFreeSpace()); HttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(urlPath); HttpResponse response = client.execute(httpGet); HttpEntity entity = response.getEntity(); long fileSize = entity.getContentLength(); fileESize = fileSize; //将文件的大小赋值给全局量,以在panDiskConnect方法中判断文件完整性 //关闭连接,谁知道能不能用,官方没有找到关闭链接的方法,先来一套 client.getConnectionManager().shutdown(); if(file.getFreeSpace() > fileSize) { System.out.println("磁盘容量满足"); return true; } return false; }判断磁盘空间是否满足
如果文件不存在,将进行首次下载
/** * 开始普通下载 */ private void startDownloadFile() { System.out.println("进入下载的url" + urlPath); try { HttpClient client = HttpClients.createDefault(); HttpGet get = new HttpGet(urlPath); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); InputStream iStream = entity.getContent(); OutputStream oStream = new FileOutputStream(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk); int len = -1; int p = 0; byte[] temp = new byte[5120]; while ((len = iStream.read(temp)) !=-1) { oStream.write(temp,0,len); p = p +len; System.out.println("字节跳动==>"+p); } oStream.flush(); oStream.close(); iStream.close(); client.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }文件不存在首次下载
文件未下载完,进行断点续传
/** * 断点续传方法 */ private void posDownload(File file) { //获取现有文件的字节 long fileLength = file.length(); System.out.println("现有字节数:" + fileLength); try { HttpClient client = HttpClients.createDefault(); HttpGet get = new HttpGet(urlPath); get.setHeader("Accept-Ranges","bytes"); get.setHeader("Range", " bytes="+fileLength+"-"); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); InputStream iStream = entity.getContent(); //iStream.skip(fileLength); OutputStream oStream = new FileOutputStream(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk,true); int len = -1; int p = 0; byte[] temp = new byte[5120]; while ((len = iStream.read(temp)) !=-1) { oStream.write(temp,0,len); p = p +len; System.out.println("字节跳动==>"+p); } oStream.flush(); oStream.close(); iStream.close(); client.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }断点续传
判断磁盘是否存在
/** * 判断用户输入的磁盘是否存在 */ private void panDiskConnect() { File fileisE = new File(PanFlag + ":\\" + downloadPath + "\\"+ fileName_Disk); File[] fs = File.listRoots(); //将磁盘列表加入LISt集合 for (File file : fs) { panS.add(file.toString().split(":")[0]); } //判断磁盘是否存在 if(panS.contains(PanFlag)) { try { //判断磁盘容量是否充足 if(panDiskSize()) { //判断文件是否存在 if(fileisE.isFile()) { System.out.println("文件长度"+fileESize); //判断文件是否下载完整,因为懒所以没有使用md5验证了 if(fileisE.length() == fileESize) { //如果下载完整就退出 System.out.println("文件已经的完整的了"); return; }else { //断点续传 posDownload(fileisE); } }else { //文件不存在的普通直接下载 startDownloadFile(); } } } catch (IOException e) { e.printStackTrace(); } }else { System.out.println("您输入的磁盘盘符不存在"); return; } }判断磁盘是否存在
这个类需要用的全局变量
private String urlPath = ""; private String PanFlag = ""; private String downloadPath = ""; private String fileName_Disk = ""; long fileESize = -1; List<String> panS = new ArrayList<String>();类需要的全局变量
run方法
@Override public void run() { panDiskConnect(); }run方法
上面的代码可能会有些乱,在家可以去我的csdn下载:传送门 今天上传文件的时候不知道怎么回事找不到修改积分的地方了,如果大家有积分希望支持下,如果没有积分大家在下方评论处留自已的邮箱我发送给大家。
相关文章推荐
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议79~82)
- 利用 Spock 为Java程序编写单元测试
- [编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝
- [编写高质量代码:改善java程序的151个建议]建议71 推荐使用subList处理局部列表
- [编写高质量代码:改善java程序的151个建议]建议93 JAVA的泛型类型是擦除的
- 编写一个c++程序来编译运行java
- 5.编写一个程序输出从2开始的素数,素数个数由用户指定,要求10个一行。java
- [编写高质量代码:改善java程序的151个建议]建议84 使用构造函数协助描述枚举项
- 在mac系统上安装Eclipse,编写java程序
- 如何使用Java编写多线程程序
- 编写一个 JAVA 程序,实现输出考试成绩的前三名
- Java与XML(二)用java编写xml的读写程序
- 读书笔记--编写高质量代码:改善java程序的151个建议(二)匿名类与构造代码块
- 用uml编写java程序
- 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)
- 搭建java web开发环境、使用eclipse编写第一个java web程序
- 用Java编写Socket客户机端程序
- 如何用editplus在编写运行Java程序及如何添加编辑运行快捷键
- 多态部分作业 1.按要求编写Java程序:(1)编写一个接口:InterfaceA,只含有一个方法int method(int n);
- java编写发手机短信的程序