JAVA编写的断点续传小程序

上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用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方法

上面的代码可能会有些乱,在家可以去我的csdn下载:传送门  今天上传文件的时候不知道怎么回事找不到修改积分的地方了,如果大家有积分希望支持下,如果没有积分大家在下方评论处留自已的邮箱我发送给大家。

猜你喜欢

转载自www.cnblogs.com/mCarrYoung/p/11073156.html