用Java的IO流可以實現從網上下載視頻,當然用Python更簡單,就是三五行代碼的事情。。。。
代碼思路
先建立一個鏈接對象,獲取到網頁的鏈接;從鏈接對象獲取到輸入流,讀取數據;建立一個輸出流,向本地文件寫入數據。
代碼步驟
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間就為成功,否則鏈接失敗6.InputStream inputStream = connection.getInputStream();獲取流只需要一行代碼,從連接對象直接get。7.String fileName = url.getFile();獲取文件名稱。8.RandomAccessFile randomAccessFile = new RandomAccessFile(fileName,"rw");采用RandomAccessFile建立文件寫入對象。
代碼大致步驟就是這樣,沒什么技術難度。全部源代碼如下:
import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * 下載視頻 * @param videoUrl 實際視頻地址 * @param downloadPath 文件下載地址 * @param fileName 文件名 * @param SuffixName 后綴名 */ public static void downVideo(String videoUrl, String downloadPath,String fileName, String SuffixName) { HttpURLConnection connection = null; InputStream inputStream = null; RandomAccessFile randomAccessFile = null; //路徑名加上文件名加上后綴名 = 整個文件下載路徑 String fullPathName = downloadPath+fileName+"."+SuffixName; try { // 1.獲取連接對象 URL url = new URL(videoUrl); // 獲取鏈接對象,就是靠這個對象來獲取流 connection = (HttpURLConnection) url.openConnection(); // Range代表讀取的范圍,bytes=0-代表從0字節到最大字節,意味著讀取所有資源 connection.setRequestProperty("Range", "bytes=0-"); // 與網頁建立鏈接,鏈接成功后就可以獲得流; connection.connect(); // 如果建立鏈接返回的相應代碼是200到300間就為成功,否則鏈接失敗,結束函數 if (connection.getResponseCode() / 100 != 2) { System.out.println("連接失敗..."); return; } // 2.獲取連接對象的流 inputStream = connection.getInputStream(); // 已下載的大小 下載進度 int downloaded = 0; // 總文件的大小 int fileSize = connection.getContentLength(); // getFile獲取此URL的文件名。返回的文件部分將與getPath()相同,具體視頻鏈接的文件名字視情況而定 // String fileName = url.getFile(); // fileName = fileName.substring(fileName.lastIndexOf("/") + 1);//特殊需要截取文件名字 // 3.把資源寫入文件 randomAccessFile = new RandomAccessFile(fullPathName, "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(fullPathName+"下載了進度:%.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(); } } }
控制臺輸出結果:
下載了進度: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)
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
399美元等于多少人民幣?在今天的場外交易中,匯率為人民幣=101393.039]=RMB=101387.039=287.039美元]=287.039美元=287.039美元]=287.039美元]=397.039美元]=RMB=287.039美元]=287.039.039美元]=287美元]=397.039.039美元]=RMB=1039.039.039美元...
怎樣在《紅警》里聯機?1. 首先,我們打開紅色警報2游戲,界面如下2。然后選擇選項,出現如下界面3。然后點擊網絡進入設置頁面4。設置目標網絡,兩臺聯機計算機設置為00.00.00。5. 點擊確定進入主界面,點擊網絡,即可加入局域網游戲。1. 鼠標右鍵是一個快速移動的界面。2. 設置team Ctrl 0-9,從當前選定的單元創建一個0-9的團隊。3. 選擇團隊0-9選擇您設置的團隊。4. 添加選擇...
計算機二級怎么注冊ETEST賬號?1. 首先,打開手機瀏覽器,打開主頁面上的搜索欄,輸入全國計算機等級考試報名系統,點擊第一個即可顯示結果。2. 進入注冊系統界面,在那里你將被要求注冊你的Etest通行證。讓我們單擊下面的-用戶注冊。3. 進入注冊頁面:電子郵件和手機號碼可以作為您的登錄賬號;密碼長度為8-18個字符,必須同時包含字母、數字和特殊字符5。提交后,將顯示一個對話框,以檢查電子郵件和手...