上了一週的課,今天終於可以休息了,太棒了,今天閒著無聊使用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 }
進行下載檔案的時候我是建立了一個子執行緒來進行處理的,這裡需要建立一個類,實現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 }
判斷磁碟空間是否滿足
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 }
上面的程式碼可能會有些亂,在家可以去我的csdn下載:傳送門 今天上傳檔案的時候不知道怎麼回事找不到修改積分的地方了,如果大家有積分希望支援下,如果沒有積分大家在下方評論處留自已的郵箱我傳送給大家。