JAVA編寫的斷點續傳小程式

CnCandy發表於2019-06-23

上了一週的課,今天終於可以休息了,太棒了,今天閒著無聊使用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下載:傳送門  今天上傳檔案的時候不知道怎麼回事找不到修改積分的地方了,如果大家有積分希望支援下,如果沒有積分大家在下方評論處留自已的郵箱我傳送給大家。

相關文章