怎么用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 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)
好了,以上就是下载视频的简单实现,小弟也是刚学的,可能有许多地方不是很好,请不吝指教。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现mp4文件上传下载,可以借助Java中的Servlet和JSP技术,以及一些第三方库,例如Apache Commons FileUpload和Apache Commons IO。 以下是一个简单的示例,演示如何使用Servlet和JSP从客户端上传和下载mp4文件: 1. 上传MP4文件 在JSP页面上创建一个表单,让用户选择要上传的MP4文件: ``` <form method="post" action="UploadServlet" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload" /> </form> ``` 在UploadServlet中,使用Apache Commons FileUpload库解析上传的文件,并将其保存到服务器上的指定位置: ``` protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(); // Parse the request FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (!item.isFormField()) { // Process the input stream String fileName = item.getName(); File file = new File("path/to/save/" + fileName); FileOutputStream fos = new FileOutputStream(file); IOUtils.copy(stream, fos); fos.close(); } } } } ``` 2. 下载MP4文件 在JSP页面上创建一个链接,让用户点击来下载MP4文件: ``` <a href="DownloadServlet?fileName=myfile.mp4">Download</a> ``` 在DownloadServlet中,根据请求参数从服务器上获取指定的MP4文件,并将其写入到响应流中: ``` protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("fileName"); File file = new File("path/to/file/" + fileName); // Set content type response.setContentType("video/mp4"); // Set content size response.setContentLength((int) file.length()); // Set headers for the response String headerKey = "Content-Disposition"; String headerValue = String.format("attachment; filename=\"%s\"", file.getName()); response.setHeader(headerKey, headerValue); // Write the file to response stream FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream(); IOUtils.copy(fis, os); os.close(); fis.close(); } ``` 需要注意的是,这只是一个简单的示例,实际上还需要进行一些错误处理和安全性检查,例如检查文件类型和大小,防止恶意文件上传和下载等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值