怎么用Java从网上下载一个视频下来

用Java的IO流从网上下载一个视频

原理:就是用URL对象与目标地址建立一个链接,用IO流的方式从这个链接上把视频的二进制数据读取下载然后再写入本地文件。

因为小弟比较菜的缘故,不会下载那些加了密的视频链接,这里我就找了一个没有假面的url来做测试:http://aqiniu.tangdou.com/C79...

代码思路

  1. 先建立一个链接对象,获取到网页的链接;
  2. 从链接对象获取到输入流,读取数据;
  3. 建立一个输出流,向本地文件写入数据。

代码实现

获取链接对象

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 blocke.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)
好了,以上就是下载视频的简单实现,小弟也是刚学的,可能有许多地方不是很好,请不吝指教。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部