摘要:用的流從網上下載一個視頻原理就是用對象與目標地址建立一個鏈接,用流的方式從這個鏈接上把視頻的二進制數據讀取下載然后再寫入本地文件。然后循環依次寫入緩存的大小,直至結束。
用Java的IO流從網上下載一個視頻
原理:就是用URL對象與目標地址建立一個鏈接,用IO流的方式從這個鏈接上把視頻的二進制數據讀取下載然后再寫入本地文件。
因為小弟比較菜的緣故,不會下載那些加了密的視頻鏈接,這里我就找了一個沒有假面的url來做測試:http://aqiniu.tangdou.com/C79...
代碼思路代碼實現先建立一個鏈接對象,獲取到網頁的鏈接;
從鏈接對象獲取到輸入流,讀取數據;
建立一個輸出流,向本地文件寫入數據。
獲取鏈接對象
public class download { //定義一個HttpURLConnection在外面,因為要在finally中關閉 HttpURLConnection connection = null; public static void main(String[] args) { try { //獲取鏈接對象 URL url = new URL(videoUrl); HttpURLConnection connection = url.openConnection(); connection.setRequestProperty("Range","bytes=0-"); connection.connect(); if(connection.getResponseCode() / 100 != 2){ System.out.println("鏈接資源失敗..."); return; } } catch (MalformedURLException e) { e.printStackTrace(); } finally { HttpURLConnection.disconnect(); } } }
好了,現在來講一下上面的代碼的作用:
1.URL url = new URL(videoUrl);
就是獲取URL的資源對象,傳入的字符串就是對應的地址;
2.HttpURLConnection connection = url.openConnection();
是獲取鏈接對象,就是靠這個對象來獲取流;
3.connection.setRequestProperty("Range","bytes=0-");
Range代表讀取的范圍,bytes=0-代表從0字節到最大字節,意味著讀取所有資源
4.connection.connect();
與網頁建立李鏈接,鏈接成功后就可以獲得流;
5.connection.getResponseCode() / 100 != 2
這一個判斷代表的是,如果建立鏈接返回的相應代碼是200到300間就為成功,否則鏈接失敗
獲取流實現:
InputStream inputStream = connection.getInputStream();
獲取流只需要一行代碼,從連接對象直接get。
實現文件的寫入:這里采用的是RandomAccessFile這個的對象。
String fileName = url.getFile(); fileName = fileName.substring(fileName.lastIndexOf("/")+1); RandomAccessFile randomAccessFile = new RandomAccessFile(fileName,"rw");
1.第一行代碼是獲取文件名稱,這里說明一下,根據這個url來看,我們獲取的fileName是/C79EBFF6107CE4389C33DC5901307461-20.mp4,意思是getFile獲取的是.com后面的路徑,所以我這里用截取字符串的方式來把文件名獲取了,當然也可以自己設置隨機的文件名
2.字符串截取
3.建立文件寫入對象
下面貼出完整的實現代碼:
package download; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class DownloadVideo { private static String videoUrl = "http://aqiniu.tangdou.com/C79EBFF6107CE4389C33DC5901307461-20.mp4"; private static final int MAX_BUFFER_SIZE = 1000000; public static void main(String[] args) { HttpURLConnection connection = null; InputStream inputStream = null; RandomAccessFile randomAccessFile = null; try { // 1.獲取連接對象 URL url = new URL(videoUrl); connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Range", "bytes=0-"); connection.connect(); if(connection.getResponseCode() / 100 != 2) { System.out.println("連接失敗..."); return; } // 2.獲取連接對象的流 inputStream = connection.getInputStream(); //已下載的大小 int downloaded = 0; //總文件的大小 int fileSize = connection.getContentLength(); String fileName = url.getFile(); fileName = fileName.substring(fileName.lastIndexOf("/") + 1); // 3.把資源寫入文件 randomAccessFile = new RandomAccessFile(fileName,"rw"); while(downloaded < fileSize) { // 3.1設置緩存流的大小 byte[] buffer = null; if(fileSize - downloaded >= MAX_BUFFER_SIZE) { buffer = new byte[MAX_BUFFER_SIZE]; }else { buffer = new byte[fileSize - downloaded]; } // 3.2把每一次緩存的數據寫入文件 int read = -1; int currentDownload = 0; long startTime = System.currentTimeMillis(); while(currentDownload < buffer.length) { read = inputStream.read(); buffer[currentDownload ++] = (byte) read; } long endTime = System.currentTimeMillis(); double speed = 0.0; if(endTime - startTime > 0) { speed = currentDownload / 1024.0 / ((double)(endTime - startTime)/1000); } randomAccessFile.write(buffer); downloaded += currentDownload; randomAccessFile.seek(downloaded); System.out.printf("下載了進度:%.2f%%,下載速度:%.1fkb/s(%.1fM/s)%n",downloaded * 1.0 / fileSize * 10000 / 100,speed,speed/1000); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { connection.disconnect(); inputStream.close(); randomAccessFile.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void demo() { try { URL url = new URL(videoUrl); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
這里在補充說明上面的代碼,MAX_BUFFER_SIZE是我設置的緩存大小,在注釋3.1那里判斷當前剩余的下載大小是否大于緩存之,如果不大于就把緩存的大小設為剩余的。
while(currentDownload < buffer.length) { read = inputStream.read(); buffer[currentDownload ++] = (byte) read; }
這段代碼是按照緩存的大小,讀寫該大小的字節。然后循環依次寫入緩存的大小,直至結束。
這樣的優勢在于,不用讓硬件頻繁的寫入,可以提高效率和保護硬盤吧
控制臺輸出結果:
下載了進度:11.59%,下載速度:388.0kb/s(0.4M/s)
下載了進度:23.19%,下載速度:262.5kb/s(0.3M/s)
下載了進度:34.78%,下載速度:261.0kb/s(0.3M/s)
下載了進度:46.38%,下載速度:258.3kb/s(0.3M/s)
下載了進度:57.97%,下載速度:260.0kb/s(0.3M/s)
下載了進度:69.57%,下載速度:260.9kb/s(0.3M/s)
下載了進度:81.16%,下載速度:257.4kb/s(0.3M/s)
下載了進度:92.75%,下載速度:252.3kb/s(0.3M/s)
下載了進度:100.00%,下載速度:286.5kb/s(0.3M/s)
好了,以上就是下載視頻的簡單實現,小弟也是剛學的,可能有許多地方不是很好,請不吝指教。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77229.html
摘要:在給老師做項目的這個期間,我也發現慕課網,然后便貪婪的在上面學習,其實現在看看上面的教學也是一些基礎,想要真的學到很多,必須做實際項目,遇到問題,然后去百度或者谷歌這個問題,看別人的博客中怎么教你解決。 前言:想當初我也是個無知騷年,學完學校的C語言基礎課程之后也就再也沒有什么想法了(期間還看了看JAVA,但是發現并不能夠學好,索性就放棄了),由于當時期末C語言程序答辯的時候,我自己仿...
摘要:在給老師做項目的這個期間,我也發現慕課網,然后便貪婪的在上面學習,其實現在看看上面的教學也是一些基礎,想要真的學到很多,必須做實際項目,遇到問題,然后去百度或者谷歌這個問題,看別人的博客中怎么教你解決。 前言:想當初我也是個無知騷年,學完學校的C語言基礎課程之后也就再也沒有什么想法了(期間還看了看JAVA,但是發現并不能夠學好,索性就放棄了),由于當時期末C語言程序答辯的時候,我自己仿...
摘要:在給老師做項目的這個期間,我也發現慕課網,然后便貪婪的在上面學習,其實現在看看上面的教學也是一些基礎,想要真的學到很多,必須做實際項目,遇到問題,然后去百度或者谷歌這個問題,看別人的博客中怎么教你解決。 前言:想當初我也是個無知騷年,學完學校的C語言基礎課程之后也就再也沒有什么想法了(期間還看了看JAVA,但是發現并不能夠學好,索性就放棄了),由于當時期末C語言程序答辯的時候,我自己仿...
摘要:學習完多線程之后可以通過下面這些問題檢測自己是否掌握,下面這些問題的答案以及常見多線程知識點的總結在這里。可選數據結構與算法如果你想進入大廠的話,我推薦你在學習完基礎或者多線程之后,就開始每天抽出一點時間來學習算法和數據結構。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 35k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://...
摘要:但發現導出來的沒有高亮語法沒有語法高亮咋看啊,所以到這里我就放棄了,將就用一下博客園生成的吧爬蟲學習上面提供的接口是一個生成一個文件,我是不可能一個一個將鏈接和標題放上去生成的因為博客園上發的也將近篇了。 前言 只有光頭才能變強 之前有讀者問過我:3y你的博客有沒有電子版的呀?我想要份電子版的。我說:沒有啊,我沒有弄過電子版的,我這邊有個文章導航頁面,你可以去文章導航去找來看呀..然后...
閱讀 2975·2021-11-16 11:51
閱讀 2608·2021-09-22 15:02
閱讀 3723·2021-08-04 10:21
閱讀 3605·2019-08-30 15:43
閱讀 1947·2019-08-30 11:04
閱讀 3599·2019-08-29 17:14
閱讀 490·2019-08-29 12:16
閱讀 2933·2019-08-28 18:31