JAVA编写的断点续传小程序
上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用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编写的断点续传小程序的更多相关文章
- Java之——实现微信小程序加密数据解密算法
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79450115 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H ...
- 用Java编写的猜拳小游戏
学习目标: 熟练掌握各种循环语句 例题: 代码如下: // 综合案例分析,猜拳案例 // isContinue为是否开始游戏时你所输入的值 char isContinue; //y为开始,n为借宿 S ...
- java全栈商业小程序开发
此次开发只为学习和巩固,第一次学习开发 一.开发前需要了解: 开发框架MVVM.痛点.开源工具.VUE前端框架.微信支付模块.uni-app前端框架.小程序申请.开发工具下载.编写测试小程序.小程序结 ...
- java服务端微信小程序支付
发布时间:2018-10-05 技术:springboot+maven 概述 java微信小程序demo支付只需配置支付一下参数即可运行 详细 代码下载:http://www.demodash ...
- 「小程序JAVA实战」微信小程序工程结构了解(五)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-05/ 微信小程序工程结构 audio,button,canvas,checkbox 都是由4个文件 ...
- 「小程序JAVA实战」微信小程序简介(一)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-01/ 一直想学习小程序,苦于比较忙,加班比较多没时间,其实这都是理由,很多时候习惯了搬砖,习惯了固 ...
- java后台获取微信小程序openid
一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...
- 微信小程序-----安装,编写第一个小程序和运行到手机端
第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID 在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...
- 「小程序JAVA实战」微信小程序的简要注册流程(二)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-02/ 了解了小程序的历史和它未来的前景,我们开始注册小程序 注册小程序 可以参考官网介绍:http ...
随机推荐
- ubuntu mysql 配置(远程访问&&字符集设置&&忽略大小写)
1.安装 参考http://www.cnblogs.com/wuhou/archive/2008/09/28/1301071.html sudo apt-get install mysql-serve ...
- 算法(Algorithms)第4版 练习 链表类 1.3.19~1.3.29
package com.qiusongde.linkedlist; import java.util.Iterator; import java.util.NoSuchElementException ...
- pycharm解决Inconsistent indentation:mix of tabs and spaces
- html5--1.9 img元素嵌入图片
html5--1.9 img元素嵌入图片 学习要点: img元素嵌入图片学习一个新属性:title 1.img的属性 1.src:必要属性,制定图片来源的路径; 2.alt属性:当图片无法显示时的替代 ...
- 引用 qsort与sort的比较
引用 linpder 的 qsort与sort的比较 在C/C++标准库中提供了快速排序的函数qsort():在STL中也提供了sort()排序函数,那么这两个函数哪个快呢?之前与代码-> ...
- 思科安全:加密流量威胁检测、加密流量威胁和恶意软件检测、识别无线干扰或威胁、Talos 情报源可加强对已知和新型威胁的防御、分布式安全异常检测
思科DNA竞品比较工具 您的网络能够驱动数字化转型吗? 根据IDC调查,45%的受调研公司计划在未来两年内做好网络数字化的准备.查看数字化网络带来的结果和商业价值. 下载报告 思科 HPE 华为 Ar ...
- swift的arc 是不是有问题?
class Arctest { let name: String = "Arctest" @lazy var ret:() -> String? = { [weak self ...
- PHP留言小练习
实现功能: 留言.搜索.编辑.删除.详情页.时间.点击量 页面划分: index.html(留言列表页) add.html(留言页) edit.php(编辑页) del.php(删除页) view.p ...
- Hover show tips
像上面这种效果,hover1时显示2,且1和2有一定间距的东东,一般有两种实现办法: 1.用JS,原理:over1时让2显示,out1时开个定时器延迟500ms再消失,over2时清除定时器,out2 ...
- HihoCoder1649 : 漏写的数字([Offer收割]编程练习赛38)(模拟题)
描述 小A今年刚上幼儿园,正在学习写100以内的数字.幼儿园的老师留了一项作业,要求小A从某个100以内的数X开始一直写到另一个100以内的数Y(Y - X > 1). 不过粗心的小A在作业中漏 ...