上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用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 }
Main方法
进行下载文件的时候我是创建了一个子线程来进行处理的,这里需要创建一个类,实现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 }
FileDowload构造函数
判断磁盘空间是否满足
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 List<String> panS = new ArrayList<String>();
类需要的全局变量
run方法
1 @Override
2 public void run() {
3 panDiskConnect();
4 }
run方法