上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用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编写的断点续传小程序的更多相关文章

  1. Java之——实现微信小程序加密数据解密算法

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79450115 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H ...

  2. 用Java编写的猜拳小游戏

    学习目标: 熟练掌握各种循环语句 例题: 代码如下: // 综合案例分析,猜拳案例 // isContinue为是否开始游戏时你所输入的值 char isContinue; //y为开始,n为借宿 S ...

  3. java全栈商业小程序开发

    此次开发只为学习和巩固,第一次学习开发 一.开发前需要了解: 开发框架MVVM.痛点.开源工具.VUE前端框架.微信支付模块.uni-app前端框架.小程序申请.开发工具下载.编写测试小程序.小程序结 ...

  4. java服务端微信小程序支付

    发布时间:2018-10-05   技术:springboot+maven   概述 java微信小程序demo支付只需配置支付一下参数即可运行 详细 代码下载:http://www.demodash ...

  5. 「小程序JAVA实战」微信小程序工程结构了解(五)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-05/ 微信小程序工程结构 audio,button,canvas,checkbox 都是由4个文件 ...

  6. 「小程序JAVA实战」微信小程序简介(一)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-01/ 一直想学习小程序,苦于比较忙,加班比较多没时间,其实这都是理由,很多时候习惯了搬砖,习惯了固 ...

  7. java后台获取微信小程序openid

    一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...

  8. 微信小程序-----安装,编写第一个小程序和运行到手机端

    第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID  在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...

  9. 「小程序JAVA实战」微信小程序的简要注册流程(二)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-02/ 了解了小程序的历史和它未来的前景,我们开始注册小程序 注册小程序 可以参考官网介绍:http ...

随机推荐

  1. 剑指Offer:二叉搜索树的后序遍历序列【33】

    剑指Offer:二叉搜索树的后序遍历序列[33] 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ...

  2. empty blank

    非nil对象才能调用 empty nil: 对象是否存在empty: ”“ []blank: nil emptypresent: ! blank

  3. Spring事务超时时间可能存在的错误认识

    摘自:http://jinnianshilongnian.iteye.com/blog/1986023, 感谢作者. 1.先看代码 1.1.spring-config.xml <bean id= ...

  4. centos下安装wordpress

    https://www.jianshu.com/p/2439dc2187b2 https://blog.csdn.net/liuhelong/article/details/79924014

  5. python读取文件的几种方式

    http://www.cnblogs.com/nkwy2012/p/6023710.html

  6. Linux(Ubuntu16.04)+GitLab8.17deb安装包搭建Git仓库(代码管理系统)

    1 下载GitLab安装包 2  执行安装命令 3 验证是否安装和启动成功 4 修改管理员密码 5 其它说明 5.1修改访问URL 5.2修改邮件配置 5.3修改web端口 1下载GitLab安装包 ...

  7. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  8. C#中多线程中变量研究

    今天在知乎上看到一个问题[为什么在同一进程中创建不同线程,但线程各自的变量无法在线程间互相访问?].在多线程中,每个线程都是独立运行的,不同的线程有可能是同一段代码,但不会是同一作用域,所以不会共享. ...

  9. 【Lintcode】103.Linked List Cycle II

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  10. 【LeetCode】070. Climbing Stairs

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...