上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用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. LeetCode:删除链表中的节点【203】

    LeetCode:删除链表中的节点[203] 题目描述 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val ...

  2. Matlab图像处理(01)-Matlab基础

    枫竹梦对于Matlab几乎是零基础,只是在上学的时候稍稍接触一点,万万没有想到现在还能用到Matlab.进入正题>>> 图像的基本概念 一幅图像可以被定义为一个二维函数f(x,y), ...

  3. hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

    题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...

  4. JNDI数据源配置

    一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Connec ...

  5. listen 70

    Better Sidewalks Could Bring Improved Public Health Most of our serious illnesses and deaths in the ...

  6. listen 54

    Our library is also open for the local residents. People are doing their Christmas shopping. Later t ...

  7. certbot申请SSL证书及中间证书问题

    首先是到https://certbot.eff.org/上申请证书,由于我们使用的web服务器是基于erlang的cowboy的,在主页上没有选项可以支持,因此在Software下拉项中选择" ...

  8. Python IOError: [Errno 13] Permission denied:

    一般是代码写错了,比如我遇到的问题就是由于 os.listdir() 传参传错导致的. 本应该传入字符串路径名,但传入了一个文件对象(object)

  9. Multiple webcams on ZoneMinder

    Monitoring a 3D Printer I have tidied my new workshop and I am starting to play with 3d-printing aga ...

  10. bzoj3312

    K个硬币,要买N个物品. 给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的.现希望买完所需要的东西后,留下的钱越多越好,如果不能完成购买任务,输出-1 $ ...