发布时间:2025-12-09 11:57:19 浏览次数:1
用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)